如何从一个文件中删除另一个文件中包含的行?

如何从一个文件中删除另一个文件中包含的行?

我有两个列表,一个完整列表和一个部分列表。我想要一个 bash 脚本,它将在完整列表中搜索部分中的任何行,如果有,它们将从完整列表中删除。有人可以帮忙吗?

答案1

grep可以从文件中读取多个模式,每行一个。与-v输出不匹配行的选项结合使用,-F匹配字符串而不是正则表达式,并-x要求整行匹配。

grep -Fvx -f partial.list complete.list >remaining.list &&
mv remaining.list complete.list

显然,第二个命令行仅适用于覆盖包含完整列表的文件的情况。

如果部分列表很大并且您不介意重新排序列表,那么join可能会更快。

答案2

你还可以使用 -

comm -23 file1 file2

必须对文件进行排序才能使命令正常工作。在命令的输出中,file2 中的条目将从 file1 中删除

答案3

如果两个列表都没有重复元素,则以下内容将起作用:

join -t$'\n' -v1 <(sort complete) <(sort partial)

如果列表可以包含重复元素,并且您只想忽略重复,则可以-u在 sort 子命令中使用该标志,这将仅输出唯一元素。

相关内容