'sort -u'和'uniq'有什么区别?

时间:2014-03-09 20:40:15

标签: bash sorting uniq

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

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

5 个答案:

答案 0 :(得分:2)

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

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

如果你转到sort包含的coreutils uniq,你可以看到它实际上只是跳过打印重复项,因为它正在打印自己的排序列表并且没有不要使用独立的 /* If uniquified output is turned on, output only the first of an identical series of lines. */ source code

要查看其工作原理,请按照排序源的链接进行操作,并查看此评论下方的功能:

sort -u

虽然我认为sort | uniq应该更快,但是除非你在大文件上运行{{1}},否则性能提升真的会很小,因为它必须再次读取整个文件。

答案 1 :(得分:2)

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

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

答案 3 :(得分:0)

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

我猜你所看到的例子根本没有考虑(或没有)“sort -u”作为选项。

答案 4 :(得分: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