2016-04-21 62 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被排序)。我发现在计算总和并读取行时显示值更有趣。 –