如何在BASH中仅打印唯一的行?

55

我该如何打印出在文件中只出现一次的行?例如,给定以下文件:

mountain
forest
mountain
eagle

输出结果将会是这样,因为mountain这一行出现了两次:

forest
eagle
  • 如果必要,这些行可以被排序。

我认为你可以使用字典。你可以查看这个链接:https://dev59.com/JHI_5IYBdhLWcg3wK_3E - user1763076
这个回答解决了你的问题吗?查找唯一行 - Mad Physicist
3个回答

119

使用sortuniq命令:

sort inputfile | uniq -u

-u选项会导致uniq只打印重复的行。引用自man uniq

-u选项会导致uniq只打印唯一的行。引用自man uniq

   -u, --unique
          only print unique lines

对于您的输入,它会产生:

eagle
forest

提示:在执行uniq -u之前记得进行sort,因为uniq只作用于相邻的行。所以实际上uniq -u打印的是没有相同相邻行的行,但这并不意味着它们是真正独特的。当你进行sort时,所有相同的行会被分组在一起,只有文件中真正独特的行会在uniq -u之后保留。


@jordan 不知道。也许有人不喜欢它。 - devnull
1
@anubhava 你试过了吗? - devnull
抱歉,我在复制/粘贴时错过了“-u”。 - anubhava
1
我喜欢简单的答案。对于那种简洁明了的回答,我会点赞。 - Rahul

19

使用 awk:

awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file
eagle
forest

2
@anubhava 刚刚测试了 30 万行。这个 awk 解决方案比 sort|uniq 快了 8 倍。 - clt60
2
由于我们正在迭代,因此我们可以快速检查并仅打印那些仅出现一次的内容。awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file 但还是+1。 - jaypal singh
1
是的,当然可以这么做。我选择删除以释放一些内存,不确定这会帮助多少 :) - anubhava
1
@anubhava 这是一个很好的观点,但是目前的解决方案可能会在重复项数量为奇数时出现混淆。例如,如果您添加另一行“mountain”,它也会将其打印出来。 - jaypal singh
1
@jaypal:啊,那是非常重要的一点。我按照你的建议进行了更新,非常感谢! - anubhava
显示剩余9条评论

9
你的问题中几乎已经有了答案: sort filename | uniq -u 这条命令将会按行排序并去重文件中的内容,然后只保留出现一次的行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接