我似乎找不到这个简单任务的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任何帮助!
答案 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;}'