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

Sto*_*nov 5 sorting bash uniq

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

有理由使用其中一种而不是另一种吗?也许可以使用 -u 选项?还是内存/速度问题?

Ian*_*rts 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
Run Code Online (Sandbox Code Playgroud)

$ sort -k 1,1 --stable example | uniq
foo baz
foo bar
quux ping
Run Code Online (Sandbox Code Playgroud)


cmr*_*ust 2

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

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

如果您查看包中的源代码,您可以看到它实际上只是跳过打印重复项,因为它打印自己的排序列表,并且不使用独立代码sortcoreutilsuniq

要了解它是如何工作的,请点击排序源的链接并查看此评论下面的函数:

 /* If uniquified output is turned on, output only the first of
   an identical series of lines. */
Run Code Online (Sandbox Code Playgroud)

尽管我认为sort -u应该更快,但除非您运行的是大文件,否则性能提升实际上很小sort | uniq,因为它必须再次读取整个文件。