2013-06-19 35 views
4

下面以特定模式删除线是我的输入文件,input.txt在一个领域

Value Value1 value2
5 1 2
1 4 3
2 1 5.5
0 0 0
4 1 0

我需要寻找第三列中的值(5.5),如果在中找到完全删除行。

,我需要像下面的输出,output.txt

Value Value1 value2
5 1 2
1 4 3
0 0 0
4 1 0

我试图awk命令删除行,但我坚持下面的部分(???)。不要如何从awk命令中删除整行的行。请建议如何实现这一点。谢谢!
awk -F"\t" '{if($3==5.5) ??? }'

回答

7

如果你想排除与第3列的值5.5所有行则:

awk '$3!=5.5' filename 
+0

感谢resposne。 'awk'$ 3!= 5.5'文件名'这个命令在没有if条件的情况下可以工作,如果它太基本的话,很抱歉。现在我没有电脑测试,稍后再试。 – Marjer

+0

是的。 awk将默认打印所有行。因此,条件是排除第3列值为“5.5”的行。 –

0
perl -lane 'next if($F[2]=~/5.5/);print' your_file 

如果第三列有5.5则该行会被删除。 但是如果第三列是5.52或15.53,那么使用上面的命令他们将被删除。 所以,如果你想只删除行,如果它有5.5精确匹配,那么使用下面:

perl -lane 'next if($F[2]=~/\b5.5\b/);print' your_file 

如下测试:

> cat temp 
Value Value1 value2 
5 1 2 
1 4 3 
2 1 5.51 
2 1 5.5 
0 0 0 
4 1 0 
> 

随着第一个命令:

> perl -lane 'next if($F[2]=~/5.5/);print' temp 
Value Value1 value2 
5 1 2 
1 4 3 
0 0 0 
4 1 0 
> 

随着第二个命令:

> perl -lane 'next if($F[2]=~/\b5.5\b/);print' temp 
Value Value1 value2 
5 1 2 
1 4 3 
2 1 5.51 
0 0 0 
4 1 0 
> 
+0

除非($ F [2] =〜/ 5.5 /),我宁愿'除非':'打印;'。似乎更具可读性。因人而异。 – devnull

+0

感谢您的回应,我用awk解决了这个问题。 – Marjer

+0

这里有一个错误。比赛应该是'$ F [2] =〜/ 5 \ .5 /'。但我不禁想知道为什么你不使用'$ F [2] eq'5.5''。 –

4

GNU更安全sed

sed -r '/\s*(\S+\s+){2}5.5/d' file