5

我需要删除第 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

4 回答 4

11
awk '$5 != 0'

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

于 2013-05-01T08:09:30.803 回答
10

甚至更快:

awk '$5' file

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

于 2013-05-01T08:15:37.810 回答
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

但如果你真的想要一个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
于 2013-05-01T08:10:17.857 回答
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
于 2013-05-01T08:08:01.590 回答