“sort -u”和“uniq”有什么区别?

5
我需要一个脚本来对文本文件进行排序并删除重复项。 大多数情况下,所有的例子都使用 sort file1 | uniq > file2 方法。 然而,在 man sort 中,有一个 -u 选项可以在排序时完成这个任务。 有没有使用其中之一的理由?也许是 -u 选项的可用性?或者是内存/速度方面的考虑?

请返回翻译后的文本:“sort -u”和“sort | uniq”的区别是什么? - underscore_d
5个回答

5

在简单情况下,它们应该是等效的,但如果您使用-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

我理解使用额外参数的影响,但我只是想了解给定示例中的基本功能。 - Stoinov

2
我不确定这是可用性的问题。我见过的大多数系统都有sortuniq,因为它们通常由同一个软件包提供。我刚刚检查了一个来自2001年的Solaris系统,它的sort带有-u选项。
从技术上讲,使用Linux管道(|)会启动一个子shell,并且将更耗费资源,因为它会从操作系统请求多个pid。
如果您转到coreutils软件包中的sort源代码,您可以看到它实际上只是在打印它自己排序的列表时跳过了重复项,并且没有使用独立的uniq代码
要查看它是如何工作的,请按照以下注释下面的链接查看sort的源代码函数:
 /* If uniquified output is turned on, output only the first of
   an identical series of lines. */

尽管我认为 sort -u 应该更快,但除非你在处理大型文件时运行 sort | uniq,否则性能提升将非常有限,因为它将不得不再次读取整个文件。


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

0

它们应该在功能上等价,sort -u 应该更有效率。

我猜你正在查看的示例可能没有考虑(或者没有)“sort -u”作为一个选项。


0

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


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