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

use*_*228 4 perl awk sed

我需要删除第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
Run Code Online (Sandbox Code Playgroud)

后:

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
Run Code Online (Sandbox Code Playgroud)

任何一个班轮都会非常有帮助.

我知道:

sed '/0/d' file_name
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*nck 10

awk '$5 != 0'
Run Code Online (Sandbox Code Playgroud)

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


fed*_*qui 8

甚至更快:

awk '$5' file
Run Code Online (Sandbox Code Playgroud)

如果第5个字段不是,0则条件被评估为true - 请注意这{print $0}是默认块,awk因此如果这是您要执行的唯一操作,则可以省略它.


Chr*_*our 7

这绝对更适合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
Run Code Online (Sandbox Code Playgroud)

但如果你真的想要一个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
Run Code Online (Sandbox Code Playgroud)


Tho*_*hor 3

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

sed '/\([^ ]\+ \+\)\{4\}0\+ /d'
Run Code Online (Sandbox Code Playgroud)

这样您就可以将零检查范围限制到第五列。

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

perl -ane 'print if $F[4]'
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出:

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
Run Code Online (Sandbox Code Playgroud)