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