Contents

sort | uniq和sort -u之间的区别

1. 概述

在本教程中,我们将快速比较 Linux 命令sort | uniq和 sort -u。两者都使用sort 从列表中删除重复条目, 但它们的操作方式略有不同。

请注意,以下所有命令均与平台无关。

2. 基本用法

让我们从名为color的文件中的颜色列表开始:

% cat color
Black
green
red
red
yellow
Green
red

如果我们想删除重复项,uniq 在某些情况下会起作用。检查uniq的手册页:

如果输入中的重复行不相邻,则不会检测到它们,因此可能需要先对文件进行排序。

对于我们的列表,结果不会是唯一条目的列表,因为我们的列表有重复的、不相邻的“红色”条目:

% uniq color
Black
green
red
yellow
Green
red

有几种方法可以解决这个问题。首先,将*-u*参数与 uniq一起使用会删除所有重复项,包括相邻的和不相邻的:

% uniq -u color
Black
green
yellow
Green
red

或者,采用手册页建议,在调用uniq之前对列表进行排序将删除所有重复项。

对列表进行排序很容易:

% sort color
Black
Green
green
red
red
red
yellow

将其通过管道传输到 uniq会产生:

% sort color | uniq
Black
Green
green
red
yellow

现在,查看sort的手册页,我们可以看到 -u标志将提供相同的输出:

% sort -u color
Black
Green
green
red
yellow

所以,一般来说,两者都sort | uniq和 sort -u做同样的事情。但也有一些不同。

例如,sort 有其他选项,如按分隔符排序。但是我们可以使用这些,而不管使用*-u* 或管道到 uniq

3. 计算唯一条目

在找到唯一项列表后,很多时候我们还想知道唯一项的数量。uniq的 -c选项将返回每个重复行的计数:

% uniq -c color
   1 Black
   1 green
   2 red
   1 yellow
   1 Green
   1 red

有点用处,但它再次遇到了忽略不相邻重复项的问题。为了避免这种情况,我们可以先对列表进行排序,然后将输出通过管道传递给uniq

sort color | uniq -c
   1 Black
   1 Green
   1 green
   3 red
   1 yellow

现在我们有一个唯一条目的列表,与邻接无关。

更进一步,假设我们想要对列表中的唯一项目进行计数。我们可以通过管道连接到wc

% sort color | uniq | wc -l
       5

或者使用sort -u而不是 uniq

% sort -u color | wc -l
       5

我们得到了我们独特的列表项的数量。