使用awk匹配不同行中的值

时间:2014-05-21 23:35:12

标签: awk

我的文件如下例所示:

8  1
8  2
17 4
17 5
17 2
19 1
19 4
19 3
19 11

我希望匹配第一列(具有相同的值)并使用awk对第二列进行求和,如下所示。

结果将是

8 3
17 11
19 19

等等。

我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

$ awk '$2>0{sum[$1]+=$2} END{for (i in sum) {print i,sum[i]}}' input | sort -n
8 3
17 11
19 19

实施说明:

  • awk从文件中读取每一行时,命令$2>0{sum[$1]+=$2}会导致部分总和被保存。

  • 读取文件后,命令END{for (i in sum) {print i,sum[i]}}会打印出结果。

  • 因为awk的数组是无序的,awk的输出被送到sort -n以产生视觉上令人愉悦的排序输出。

更好的格式化

要使用右对齐列生成输出,请使用printf代替print

$ awk '$2>0{sum[$1]+=$2} END{for (i in sum) {printf "%3s%3s\n",i,sum[i]}}' input | sort -n
  8  3
 17 11
 19 19