2011-05-06 70 views
2

我有格式化像一个文件:选择每行一个值 - awk的

10.0.0.1  87.220.150.64 131 
10.0.0.1  87.220.172.219 131 
10.0.0.1  87.220.74.162 131 
10.0.0.1  87.220.83.17 58 
10.0.0.1  87.220.83.17 58 
1.160.138.209 10.0.0.249  177 
1.160.138.209 10.0.0.249  354 
1.160.138.249 10.0.0.124  296 
1.160.139.125 10.0.0.252  129 
1.160.139.207 10.0.0.142  46 

第一和第二列是IP地址,第三个是IP地址之间传送的字节。我必须计算每个IP地址发送或接收的东西数量。

我使用下面的awk程序来计算每个IP发送了多少字节,但我无法弄清楚如何编辑它以计算接收到的字节。

awk '{ a[$1 " " $2] += $3 } END { for (i in a) { print i " " a[i] } }' input.txt | sort -n 

回答

3

这不区分发送的字节和接收到的字节。

# bytes-txrx.awk -- print bytes sent or received by each 10.* ip address. 
# Does not guard against overflow. 
# 
# Input file format: 
# 10.0.0.1  87.220.150.64 131 
# 10.0.0.1  87.220.172.219 131 
# 10.0.0.1  87.220.74.162 131 
# 10.0.0.1  87.220.83.17 58 
# 10.0.0.1  87.220.83.17 58 
# 1.160.138.209 10.0.0.249  177 
# 1.160.138.209 10.0.0.249  354 
# 1.160.138.249 10.0.0.124  296 
# 1.160.139.125 10.0.0.252  129 
# 1.160.139.207 10.0.0.142  46 
# 
$1 ~ /^10\./ {a[$1] += $3;} 
$2 ~ /^10\./ {a[$2] += $3;} 
END { 
    for (key in a) { 
    print key, a[key]; 
    } 
} 

$ awk -f test.awk test.dat 
10.0.0.1 509 
10.0.0.252 129 
10.0.0.249 531 
10.0.0.142 46 
10.0.0.124 296 
+2

+1。我会用正则表达式更具体一些:'$ 1〜/^10 \ ./'和'$ 2〜/^10 \ ./' – 2011-05-06 16:34:30

+0

好点。我纳入了这一变化。 – 2011-05-06 16:52:41

0

只是排序列2和你有它:

$ awk '{ a[$1 " " $2] += $3 } END { for (i in a) { print i " " a[i] } }' input.txt | sort -n -k 2 

但是你的描述不符计算。你不计算IP发送多少。您计算从A发送到B的数量。A发送的数量与B收到的数量相同。