根据列中的特定单词删除特定行

时间:2013-07-24 19:14:45

标签: bash tsv

我有非常大的制表符分隔文件,我需要删除特定列中出现“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

5 个答案:

答案 0 :(得分:5)

使用grep -v

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

或者使用awk:

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

答案 1 :(得分:1)

这应该可以解决问题:

$ sed '/TelePacific/d' file

如果您对输出感到满意,请使用-i选项将更改存储回文件。

$ sed -i '/TelePacific/d' file

修改

仅返回第四列中TelePacific的结果:

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

或反过来:

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

答案 2 :(得分:1)

fgrep -v会这样做。

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

fgrep -v TelePacific inputfile.tsv > outputfile.tsv

如上所述 anubhava ,您可以选择grep -v "\bTelePacific\b",以确保您不会意外地匹配“TelePacificFoo”或“FooTelePacific”。

答案 3 :(得分:0)

这是sed的解决方案

#!/bin/bash

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

答案 4 :(得分:0)

试试这个:

grep -v TelePacific in-file > out-file

-v选项会反转搜索,因此grep会打印与搜索模式不匹配的所有行。

如果in-fileout-file相同,则无效。要实现您必须使用这样的临时文件:

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