我需要对文本文件进行排序并删除重复项的脚本。
大多数(如果不是全部)示例都使用sort file1 | uniq > file2
方法。
但是在man sort中,有一个-u选项可以在排序时执行此操作。
是否有理由使用其中一个?也许-u选项的可用性?还是内存/速度问题?
答案 0 :(得分:2)
我不确定这是关于可用性的。我见过的大多数系统都有sort
和uniq
,因为它们通常由同一个包提供。我刚刚从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.04
和CentOS 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
。