4

假设我有一个包含如下行的文本文件:

foo 10
bar 15
bar 5
foo 30
...

生成以下输出的最简单方法是什么:

foo 40
bar 20

?

4

4 回答 4

9

这将做:

awk '{arr[$1]+=$2;} END { for (i in arr) print i, arr[i]}'  file

有关更多信息,请阅读 Awk 的关联数组。

于 2012-11-06T20:37:43.730 回答
5

使用这个 awk 脚本:

awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' infile

输出:

foo 40
bar 20

使用这个关于使用关联数组的 awk 教程

于 2012-11-06T20:38:45.613 回答
0

如果你对 perl 感兴趣:

perl -F -lane '$X{$F[0]}=$X{$F[0]}+$F[1];if(eof){foreach (keys %X){print $_." ".$X{$_}}}' your_file
于 2012-11-07T05:53:47.460 回答
0

这是排序、GNU sed 和 bc 的一种方法:

sort infile | 
  sed -r ':a; N; s/([^ ]+) +([^\n]+)\n\1/\1 \2 +/; ta; P; D' |
  sed -r 'h; s/[^ ]+/echo/; s/$/ | bc/e; G; s/([^\n]+)\n([^ ]+).*/\2 \1/'

输出:

bar 20
foo 40

第一个 sed 使用相同的键+在数字之间添加 a 连接相邻行,第二个将总和传递给 bc。

于 2012-11-07T10:58:01.227 回答