我有两个列表,一个完整列表和一个部分列表。我想要一个 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 子命令中使用该标志,这将仅输出唯一元素。