2013-05-01 126 views
4

我需要删除其中包含列号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。

回答

3

随着便携式sed中,你可以做这样的:

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

这样,你只限于检查零到第五列。

有了,你不需要指定$F[4]的条件,因为它是隐含的perl的,你可以使用自动分割,注意:在这两种情况下

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 
9
​​

除非添加此额外文本,否则本机不会让我提交。

+0

+1我以前从来没有见过这样的语法,挺整齐:) – 2013-05-01 08:11:08

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 
+1

+1给出两种方式,都很清楚。 – fedorqui 2013-05-01 08:24:11

8

甚至更​​快:

awk '$5' file 

如果第5场而不是0然后条件评估为真 - 没有te {print $0}awk中的默认块,因此如果这是您想要执行的唯一操作,则可以省略它。

相关问题