2013-07-24 188 views
1

我有非常大的制表符分隔文件,我需要删除特定列中出现单词“TelePacific”的所有行。在这种情况下,TelePacifc在第4列中出现的所有行。下面是一个例子输入文件:根据列中的特定字删除特定的行

7/18/13 10:06 0:00:09 TelePacific random person DEREK   9256408665 random company 
7/18/13 10:07 0:00:21 TelePacific random person DEREK   9256408665 random company 
7/18/13 10:10 0:19:21 TelePacific random person DEREK   9256408665 random company 
7/18/13 10:39 0:01:07 random person  107 
7/18/13 11:02 0:01:41 random person Gilbert  107 TelePacific 
7/18/13 12:17 0:00:42 random person Gilbert  107 TelePacific 
7/18/13 13:35 0:00:41 random person Gilbert  107 TelePacific 
7/18/13 13:44 0:12:30 TelePacific ADKNOWLEDGE  8169311771 random company 
7/18/13 14:46 0:19:48 TelePacific TOLL FREE CALL 8772933939 random company 
7/15/13 10:09 0:01:27 random person Esquivel  272 TelePacific 
7/15/13 10:16 0:00:55 random person Esquivel  272 TelePacific 
7/15/13 10:59 0:00:51 random person Esquivel  272 TelePacific 
7/15/13 11:01 0:01:09 random person Esquivel  272 TelePacific 

回答

3

使用grep -v

grep -v "\bTelePacific\b" file > output && mv output file 

或者用awk:

awk '$4 != "TelePacific"' file > output && mv output file 
+2

对于'\ b'(“匹配单词边界”)+1,所以您只匹配_word_“TelePacific”而不是“FooTelePacific”或“TelePacificFoo”。 –

+0

字界是一个好主意! +1 – Kent

0

这里与sed的

#!/bin/bash 

sed '/TelePacific/d' your_file.txt > file_without_telepacific.txt 
1

解决这应该做的伎俩:

$ sed '/TelePacific/d' file 

如果你很高兴与输出使用-i选项将更改存储回文件。

$ sed -i '/TelePacific/d' file 

编辑:

要只在第四列返回结果TelePacific

$ awk '$4=="TelePacific"' file 

或者逆:

$ awk '$4!="TelePacific"' file 
+0

这不会也删除文本行'FooTelePacific'? – anubhava

+1

当然会,但问题不是那么具体。 – ahilsend

+0

@ahilsend:示例文件和此语句“我有非常大的制表符分隔文件”表示它是一个单独的词。 – anubhava

1

fgrep -v会做到这一点。

fgrep相当于grep -F并且阻止grep将模式中的特殊字符解释为正则表达式控制字符。 -v参数会导致fgrep输出所有不会匹配模式的行,而不是输出行(这是默认设置)。

fgrep -v TelePacific inputfile.tsv > outputfile.tsv 

由于anubhava上面提到的,你可以选择grep -v "\bTelePacific\b"代替,以确保您不会意外匹配“TelePacificFoo”或“FooTelePacific”。

+0

无论如何,它只在第4列中搜索TelePacific的实例吗? – Fr0ntSight

+0

@ Fr0ntSight这是grep相关工具停止非常有用的地步。你可以编写一个非常讨厌的正则表达式来解析标签,或者在shell脚本中创建一个聪明的循环,但是awk实际上是设计用于空白分隔的分隔字段,并且使得_anubhava_的awk解决方案成为该作业的正确工具。 –

0

试试这个:

grep -v TelePacific in-file > out-file 

-v选项反转搜索,所以grep的打印所有行,唐” t匹配搜索模式。

如果in-fileout-file是相同的,这将不起作用。要达到您必须使用像这样的临时文件:

grep -v TelePacific in-file > in-file.tmp && mv in-file.tmp in-file