2016-04-21 64 views
1

我有,看起來像一個文件的特定行總和字段:awk中基於susbtring

100001001 0 130 
100001001 0 610 
100001001 0 210 
100001001 0 100 
100001001 1 80 
100001002 0 300 
100001002 0 200 
100001002 0 100 
100001003 0 200 
100001003 0 100 
100001004 1 50 

我想總結第三場對每個相同的第1場,並排除這個總的線是含有1在第二場,通過類似以下的輸出:

100001001 1050 
100001002 600 
100001003 300 

我已經到目前爲止的工作似乎沒有出於某種原因的命令,有人可以幫助我?

awk ' $2 != 1 { sum[$1] += $3 }' 

回答

3

這一個班輪應該有所幫助:

awk '$2!=1{a[$1]+=$3}END{for(x in a)print x, a[x]}' file 

的問題在你的代碼是,你在一個數組做款項後沒有打印輸出。

1

試用一下這個測試的一個:

awk '{ if (NR==1) {sum=0} else if (lastid!=$1) {printf("%s %s\n", lastid, sum); sum=0} if ($2!=1) {sum+=$3} lastid=$1} END{if (sum>0) print lastid, sum}' afile 

假定第一列進行排序。

+0

awk不是C.你現在用awk做什麼就好像你在使用C++但只使用過程式編程,而只是C中存在的C++結構的子集 - 它缺少了C++的重點/好處語言。請參閱[@ Kent's answer](http://stackoverflow.com/a/36767662/1745001),如果您想了解如何使用awk,請閱讀Arnold Robbins編寫的Effective Awk Programming第4版。 –

+0

@EdMorton Waou!謝謝!這不是一個慣用的版本,但它已經過測試。我會小心閱讀這本書。 –

+0

@EdMorton如果您特別提到關聯數組,我會小心不要在我的答案中使用它們,以突出顯示「END」部分不是必需的(如果第一列id被排序)。我發現在計算總和並讀取行時顯示值更有趣。 –