如何用Bash脚本移除两个文本文件中的重复行
移除两个文件中共同存在的行
你要的是彻底删掉同时出现在两个文件里的行,只保留仅在单个文件中出现的内容,之前用的命令不对是因为它们的逻辑并非“删除跨文件重复的行”,下面给几个靠谱的解决方法:
方法一:sort + uniq -u(简单直接)
这个组合刚好能满足需求:先把两个文件的内容合并排序,uniq -u会只保留恰好出现一次的行(也就是那些只在a或只在b里的行)。
命令:
sort a.txt b.txt | uniq -u
如果之前用这个没得到正确结果,大概率是文件里有不可见字符(比如行尾空格、Windows风格的回车符\r),可以先预处理去掉这些干扰:
sort <(tr -d ' \r' < a.txt) <(tr -d ' \r' < b.txt) | uniq -u
方法二:awk(无需排序,灵活可控)
如果不想排序,或者需要自定义输出顺序,用awk更合适:
通用版(不保留原始顺序)
统计所有行的出现次数,只打印出现过一次的行:
awk '{count[$0]++} END{for(line in count) if(count[line]==1) print line}' a.txt b.txt
保留原始顺序版(先a的独有行,再b的独有行)
如果你想和示例输出的顺序一致(先a里独有的,再b里独有的),用这个:
awk 'NR==FNR{a[$0]=1;next} !($0 in a){print} {delete a[$0]} END{for(k in a) print k}' a.txt b.txt
为什么你之前的命令没用?
sort | uniq -u:如果之前没得到正确结果,大概率是文件有不可见字符干扰,或者没正确合并两个文件排序awk '!a[$0]++':这个命令的逻辑是保留第一次出现的行,后续重复的跳过,所以会保留a里的f.g.h.com,而不是彻底删掉,不符合你的需求
内容的提问来源于stack exchange,提问作者xrkr
相关产品推荐
相关产品推荐

