我有 2 个文本文件 a.txt 和 b.txt 包含单列数据。我想使用 bash 脚本从两个文件中删除相同的数据。
例如 a.txt包含以下数据
a.b.c.com
c.d.e.com
f.g.h.com
并且b.txt包含如下数据
i.j.k.com
f.g.h.com
输出应该是
a.b.c.com
c.d.e.com
i.j.k.com
我尝试过 sort、uniq -u 等..但它们都没有给我正确的输出。
sort a.txt b.txt | uniq -u
awk '!a[$0]++' a.txt b.txt
这与问题如何删除文件中的重复行?不同,因为我需要完全删除相同的行。我什至不需要它出现一次。例如,f.g.h.com 在上面的参考中已被完全删除。
使用任何 awk:
$ awk '{cnt[$0]++} END{for (i in cnt) if (cnt[i] == 1) print i}' a.txt b.txt
c.d.e.com
i.j.k.com
a.b.c.com
或排序+uniq+awk:
$ sort a.txt b.txt | uniq -c | awk '$1==1{sub(/ +[^ ]+ /,""); print}'
a.b.c.com
c.d.e.com
i.j.k.com
我假设您不关心输出行的顺序,但如果您这样做,请编辑您的问题以说明它们应该如何排序。
OP 尝试使用
sort
所以我认为这意味着我们不需要维护行的原始顺序。
对于排序后的数据,我们可以使用
comm
过滤掉两个文件中都存在的行:
$ comm -3 <(sort a.txt) <(sort b.txt)
a.b.c.com
c.d.e.com
i.j.k.com
然后我们可以通过管道传输到
sed
以删除 \t
特有的那些行的前导选项卡 (b.txt
):
$ comm -3 <(sort a.txt) <(sort b.txt) | sed 's/^\t//'
a.b.c.com
c.d.e.com
i.j.k.com