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

使用awk基于两个匹配字段的求和列,awk,Awk,对于这个简单的任务,我似乎找不到一个awk解决方案。我可以根据一个匹配字段($1)轻松地对一列($3)求和: 现在,如何基于两个字段来实现这一点?比如说1美元和2美元?以下是一个示例数据: P1,gram,10 P1,tree,12 P1,gram,34 P2,gram,23 ... 如果第一个字段和第二个字段匹配,我只需要对第3列求和 谢谢你的帮助 像这样 awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print

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

现在,如何基于两个字段来实现这一点?比如说1美元和2美元?以下是一个示例数据:

P1,gram,10  
P1,tree,12  
P1,gram,34  
P2,gram,23  
...
如果第一个字段和第二个字段匹配,我只需要对第3列求和

谢谢你的帮助

像这样

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的“逗号修复”编辑了上面的答案。

针对需要更少内存但首先需要排序的解决方案(没有任何内容是免费的):


谢谢你的回答Ray Toal,但我已经尝试过这个解决方案,但它不能满足我的需要,事实上我真的需要将我的字段分隔开来以便进一步处理…@yiuh的修复程序保留了三列输出;答案已编辑。这需要一个大文件的大量内存。观察得不错,@jfgagne。对于大文件,可以使用
排序
。而mapreduce需要数十GB的时间。:)
P1,tree,12
P1,gram,44
P2,gram,23
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;}'