如果特定列包含零,如何删除整行?

时间:2013-05-01 08:05:30

标签: perl sed awk

我需要删除包含的行 第5列中的0值。

在:

1QWO     10      5     45    100    7.5
1R0R      6      3     15    100    8.5
1R5M      4      0      6      0    6.5
1R8S      4      0      6      0      6
1R9L      2      1      1    100    6.3
1RG8      6      0     15      0    5.8
1RJU     10      0     45      0    7.2
1RKI     12      6     66    100    4.6

后:

1QWO     10      5     45    100    7.5
1R0R      6      3     15    100    8.5
1R9L      2      1      1    100    6.3
1RKI     12      6     66    100    4.6

任何一个班轮都会非常有用。

我知道:

sed '/0/d' file_name

但是上面的命令将从所有列中删除0。

4 个答案:

答案 0 :(得分:10)

awk '$5 != 0'

除非我添加这些额外的文字,否则机器不会让我提交。

答案 1 :(得分:8)

更快:

awk '$5' file

如果第5个字段不是0,则条件被评估为真 - 请注意{print $0}awk中的默认块,因此如果这是唯一的操作,则可以省略它你想表演。

答案 2 :(得分:6)

这绝对更适合awk

$ awk '$5!=0' file
1QWO     10      5     45    100    7.5
1R0R      6      3     15    100    8.5
1R9L      2      1      1    100    6.3
1RKI     12      6     66    100    4.6

但如果你真的想要一个sed解决方案:

$ sed -r '/\S+\s+{4}0\s+/d' file
1QWO     10      5     45    100    7.5
1R0R      6      3     15    100    8.5
1R9L      2      1      1    100    6.3
1RKI     12      6     66    100    4.6

答案 3 :(得分:3)

使用便携式sed,您可以这样做:

sed '/\([^ ]\+ \+\)\{4\}0\+ /d'

这样就可以将检查零到第五列。

使用perl,您可以使用自动拆分,请注意您不需要为$F[4]指定条件,因为它是隐式的:

perl -ane 'print if $F[4]'

两种情况下的输出:

1QWO     10      5     45    100    7.5
1R0R      6      3     15    100    8.5
1R9L      2      1      1    100    6.3
1RKI     12      6     66    100    4.6