每行选择一个值 - awk

时间:2011-05-06 15:52:23

标签: linux 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之间传输的字节。我必须计算每个10.something IP-address发送或接收的字节数。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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接收的数量相同。