删除文件中与其他文件中的模式匹配的值

时间:2015-09-15 15:26:57

标签: bash unix

我在一个文件中有一个值列表:

item2
item3
item4

我希望在行如下所示时从另一个文件中删除整行:

item1|XXXX|ABCD
item2|XXXX|ABCD
item3|XXXX|ABCD
item4|XXXX|ABCD
item5|XXXX|ABCD

所以我离开了:

item1|XXXX|ABCD
item5|XXXX|ABCD

是否有bash序列来执行此操作?

3 个答案:

答案 0 :(得分:2)

grep -vf可以完成这项工作:

grep -vFf file1 file2
item1|XXXX|ABCD
item5|XXXX|ABCD

答案 1 :(得分:2)

如果您的独特标记是|XXXX|ABCD|字符串,则可以grep出来:

$ grep -vF '|XXXX|ABCD|' input > output

使用选项-F(固定字符串)更安全,因为您的模式非常接近于包含正则表达式元字符(即在您的情况下:| - 它在默认grep中不活动正则表达式语法,但你不想在使用简单模式时担心这一点。)

如果您的独特模式是该行的其余部分,则可以使用grep的{​​{1}}选项将整个文件用作模式列表:

-f

答案 2 :(得分:2)

要求救援!

$ awk -F"|" 'NR==FNR{a[$1];next} !($1 in a)' remove items
item1|XXXX|ABCD
item5|XXXX|ABCD

其中要删除的项目列表位于文件“remove”中,数据位于文件“items”