计算出现次数并删除匹配值的行

计算出现次数并删除匹配值的行

我可以得到一些帮助来解决我的问题吗?我有一个如下所示的文件(逗号分隔):

A,250,13,820,0,80,201  
B,0,0,0,0,3,0  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10  

我想删除一行,如果它有 5 个真正的零值,在本例中为 B 行。最终文件应如下所示:

A,250,13,820,0,80,201  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10

我在编写代码时遇到困难,因为awk总是考虑所有零(每行都有五个零值,但只有 B 行有五个真正的零)。如果有脚本会更容易吗perl

答案1

Perl 来救援!

perl -aF, -ne 'print unless 5 == grep /^0$/, @F;' < input > output
  • -n逐行读取输入
  • -a将每一行分割成 @F 数组
  • -F指定如何拆分(在本例中为逗号)
  • grep在标量上下文中使用返回命中数。

答案2

用 awk

awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile

答案3

如果您的文件中没有其他数字0开头0,并且第一个字段不是示例中的数字,您可以执行以下操作:

sed -ne 's/,0//5;t' -e p < input > output

请注意,它会删除那些具有至少5个零。

再次使用您的样本,:

grep ',.*[1-9].*,.*[1-9]'

也会这样做(在第一个字段之后搜索两个非零字段)。

答案4

awk 'gsub(/,0/, ",0", $0) != 5' data.input

相关内容