bash - awk 命令对行求和并在特定条件下过滤掉

标签 bash awk

我有一个包含数字的文件,我想对两行中的数字求和,然后对每一列求和,然后在我的最后一步中,我想过滤掉计数大于或等于“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/

相关文章:

linux - 如何使用列表生成配置文件

linux - 如何使用 Bash 文件中列表中的变量处理文件名

Bash 将 heredoc 输出重定向到/dev/null

perl - AWK - 根据时间删除除最后一次出现的日志文件行之外的所有内容

linux - 在这种情况下如何使用 shell、bash 或 sed 命令

regex - 使用 awk 时缺少一些文件夹名称

Linux:将DD结果输出到文本文件

linux - 终止 MySQLd session 以返回命令提示符

python - 如何传递 docopt 参数,其中参数是 python 中带空格的字符串

linux - 如何使用 sed/awk/perl 从特定列中删除 n 个字符