使用awk基于两个匹配字段的sum列

时间:2011-08-07 01:05:21

标签: awk

我似乎找不到这个简单任务的awk解决方案。我可以根据一个匹配字段($ 1)轻松地将一列($ 3)与:

相加
awk -F, '{array[$1]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv

现在,我该如何根据两个字段来做到这一点?让我们说$ 1和$ 2?这是一个示例数据:

P1,gram,10  
P1,tree,12  
P1,gram,34  
P2,gram,23  
...

如果第一个和第二个字段匹配,我只需要对第3列求和。

Thanx任何帮助!

2 个答案:

答案 0 :(得分:6)

喜欢这样

awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv

我的结果

P1,tree,12
P1,gram,44
P2,gram,23

修改

由于OP需要逗号留在输出中,我使用@ yi_H的“逗号修复”编辑了上面的答案。

答案 1 :(得分:1)

对于需要较少内存但需要先排序(没有任何内容)的解决方案:

sort datas.csv | awk -F "," 'NR==1{last=$1 "," $2; sum=0;}{if (last != $1 "," $2) {print last "," sum; last=$1 "," $2; sum=0;} sum += $3;}END{print last "," sum;}'