【问题标题】:What is the difference between 'sort -u' and 'uniq'?“sort -u”和“uniq”有什么区别?
【发布时间】:2014-03-09 20:40:14
【问题描述】:

我需要对文本文件进行排序并删除重复项的脚本。 大多数(如果不是全部)示例都使用sort file1 | uniq > file2 方法。 不过,在man sort 中,有一个 -u 选项可以在排序时执行此操作。

有理由使用其中一个吗?也许 -u 选项的可用性?还是内存/速度问题?

【问题讨论】:

标签: bash sorting uniq


【解决方案1】:

在简单的情况下它们应该是等价的,但如果您使用-k 选项仅定义输入行的某些字段 以用作排序键,则它们的行为会有所不同。在这种情况下,sort -u 将抑制具有 相同键 的行,即使该行的其他部分不同,而 uniq 将只抑制完全相同的行。

$ cat example 
foo baz
quux ping
foo bar
$ sort -k 1,1 --stable example # use just the first word as sort key
foo baz
foo bar
quux ping
$ sort -k 1,1 --stable -u example # suppress lines with the same first word
foo baz
quux ping

但是

$ sort -k 1,1 --stable example | uniq
foo baz
foo bar
quux ping

【讨论】:

  • 我了解使用附加参数的含义,但我只是想知道给定示例中的基本功能。
【解决方案2】:

我不确定这与可用性有关。我见过的大多数系统都有sortuniq,因为它们通常由同一个包提供。我刚刚检查了一个 2001 年的 Solaris 系统,它的 sort-u 选项。

从技术上讲,使用 linux 管道 (|) 会启动一个子 shell,并且会更加占用资源,因为它会从操作系统请求多个 pid。

如果您转到 sortsource code,它包含在 coreutils 包中,您可以看到它实际上只是跳过打印重复项,因为它正在打印自己的排序列表并且不使用独立uniqcode

要查看它是如何工作的,请点击排序源的链接并查看此评论下方的功能:

 /* If uniquified output is turned on, output only the first of
   an identical series of lines. */

虽然我认为sort -u 应该更快,但性能提升确实很小,除非您在大文件上运行sort | uniq,因为它必须再次读取整个文件。

【讨论】:

    【解决方案3】:

    一个区别是'uniq -c'可以计算(并打印)匹配的数量。当您使用“sort -c”进行排序时,您将失去此能力。

    【讨论】:

      【解决方案4】:

      它们在功能上应该是相同的,sort -u 应该更有效。

      我猜您正在查看的示例根本没有考虑(或没有)“sort -u”作为选项。

      【讨论】:

        【解决方案5】:

        uniq 是否排序? 我不这么认为... 因为,至少在Ubuntu 18.04CentOS 6 上,它没有。它只会删除连续的重复项。

        您可以简单地进行一个小实验。

        让文件sample.txt为:

        a
        a
        a
        b
        b
        b
        a
        a
        a
        b
        b
        b
        

        cat sample.txt | uniq 将输出:

        a
        b
        a
        b
        

        cat sample.txt | sort -u 将输出:

        a
        b
        

        sort | uniq 在功能上可能等同于sort -u

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-28
          • 2017-03-19
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 2012-05-08
          • 2022-01-08
          相关资源
          最近更新 更多