2011-08-07 120 views
6

我似乎無法爲此簡單任務找到awk解決方案。我可以很容易地總結與列基於一個匹配字段($ 1)($ 3):基於使用awk的兩個匹配字段的總和列

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的任何幫助!

回答

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的答案「逗號修復「。

+0

謝謝您的回答雷特里,但我已經嘗試過這種解決方案並不能滿足我的需要,在事實上,我真的需要保持我的領域分開進一步處理... – Chargaff

+2

逗號修復:'數組[$ 1','$ 2]' –

+0

@ yi_H的修復保留了三列輸出;回答編輯。 –

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;}' 
相關問題