【问题标题】:How to print only the unique lines in BASH?如何仅打印 BASH 中的唯一行?
【发布时间】:2014-07-07 13:53:07
【问题描述】:

如何只打印文件中仅出现一次的行?例如,给定这个文件:

mountain
forest
mountain
eagle

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

forest
eagle
  • 如有必要,可以对行进行排序。

【问题讨论】:

标签: bash uniq


【解决方案1】:

使用 awk:

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

【讨论】:

  • @anubhava 刚刚在 300k 行上进行了测试。这个awk 解决方案比sort|uniq 快8 倍。
  • 由于我们在迭代,我们可以快速检查和打印只看到一次的那些。 awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file 但仍然 +1。
  • 是的,当然也可以,我只是选择删除来释放一些内存,不知道有多大帮助:)
  • @anubhava 这是一个有效的观点,但由于现在的解决方案是,当 dup 的数量为奇数时,它可能会感到困惑。例如,如果您添加另一个 mountain 行,它也会打印出来。
  • @jaypal:啊,这很重要。我按照你的建议更新了,非常感谢!
【解决方案2】:

使用sortuniq

sort inputfile | uniq -u

-u 选项将导致uniq 仅打印唯一行。引用man uniq:

   -u, --unique
          only print unique lines

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

eagle
forest

Obs:记得在uniq -u 之前使用sort,因为uniq相邻 行上运行。所以uniq -u 实际上所做的是打印没有相同相邻行的行,但这并不意味着它们真的是独一无二的。当您sort 时,所有相同的行都会组合在一起,只有在文件中真正唯一的行才会保留在uniq -u 之后。

【讨论】:

  • @jordan 不知道。也许有人不喜欢它。
  • @anubhava 你试过了吗?
  • 抱歉我在复制/粘贴时错过了-u
  • 我喜欢简单的答案。为简单起见 +1。
【解决方案3】:

你的问题几乎已经有了答案:

sort filename | uniq -u

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-10-25
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多