我有一个包含数字的文件,我想对两行中的数字求和,然后对每一列求和,然后在我的最后一步中,我想过滤掉计数大于或等于“0”的 3 的行对总和很重要。我写了一个小例子来说明:
这是我的文件(没有 c 的注释),它包含 2 对行(=4 行)和 5 列。
2 6 0 8 9 # pair 1.A
0 1 0 5 1 # pair 1.B
0 2 0 3 0 # pair 2.A
0 0 0 0 0 # pair 2.B
我需要总结成对的线,所以我得到这样的东西(中间步骤)
2 7 0 13 10 # sum pair 1, it has one 0
0 2 0 3 0 # sum pair 2, it has three 0
然后我想打印原始行,但只有那些 0 之和(两行之和)小于 3 的行,因此我应该打印这个:
2 6 0 8 9 # pair 1.A
0 1 0 5 1 # pair 1.B
因为第二对线的和有3个0
,那么应该排除
所以我需要从第一个文件得到最后一个输出。
到目前为止,我能做的是对成对的行求和,计算零,并识别那些计数小于 0
的 3 的行,但我不知道如何打印两行对 SUM 有贡献,我只能打印两行中的一行(最后一行)。这是我正在使用的 awk:
awk '
NR%2 { split($0, a); next }
{ for (i=1; i<=NF; i++) if (a[i]+$i == 0) SUM +=1;
if (SUM < 3) print $0; SUM=0 }' myfile
(这就是我现在得到的)
0 1 0 5 1 # pair 1.B
谢谢!
最佳答案
另一种变体可能有助于避免某些输入情况下的循环迭代:
awk '!(NR%2){ zeros=0; for(i=1;i<=NF;i++) { if(a[i]+$i==0) zeros++; if(zeros>=3) next }
print prev ORS $0 }{ split($0,a); prev=$0 }' file
输出:
2 6 0 8 9
0 1 0 5 1
关于bash - awk 命令对行求和并在特定条件下过滤掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45145346/