从 2 个文件中删除重复行

问题描述 投票:0回答:2

我有 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 在上面的参考中已被完全删除。

bash sorting awk
2个回答
1
投票

使用任何 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

我假设您不关心输出行的顺序,但如果您这样做,请编辑您的问题以说明它们应该如何排序。


1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.