【发布时间】:2014-03-09 20:40:14
【问题描述】:
我需要对文本文件进行排序并删除重复项的脚本。
大多数(如果不是全部)示例都使用sort file1 | uniq > file2 方法。
不过,在man sort 中,有一个 -u 选项可以在排序时执行此操作。
有理由使用其中一个吗?也许 -u 选项的可用性?还是内存/速度问题?
【问题讨论】:
我需要对文本文件进行排序并删除重复项的脚本。
大多数(如果不是全部)示例都使用sort file1 | uniq > file2 方法。
不过,在man sort 中,有一个 -u 选项可以在排序时执行此操作。
有理由使用其中一个吗?也许 -u 选项的可用性?还是内存/速度问题?
【问题讨论】:
在简单的情况下它们应该是等价的,但如果您使用-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
【讨论】:
我不确定这与可用性有关。我见过的大多数系统都有sort 和uniq,因为它们通常由同一个包提供。我刚刚检查了一个 2001 年的 Solaris 系统,它的 sort 有 -u 选项。
从技术上讲,使用 linux 管道 (|) 会启动一个子 shell,并且会更加占用资源,因为它会从操作系统请求多个 pid。
如果您转到 sort 的 source code,它包含在 coreutils 包中,您可以看到它实际上只是跳过打印重复项,因为它正在打印自己的排序列表并且不使用独立uniqcode。
要查看它是如何工作的,请点击排序源的链接并查看此评论下方的功能:
/* If uniquified output is turned on, output only the first of an identical series of lines. */
虽然我认为sort -u 应该更快,但性能提升确实很小,除非您在大文件上运行sort | uniq,因为它必须再次读取整个文件。
【讨论】:
一个区别是'uniq -c'可以计算(并打印)匹配的数量。当您使用“sort -c”进行排序时,您将失去此能力。
【讨论】:
它们在功能上应该是相同的,sort -u 应该更有效。
我猜您正在查看的示例根本没有考虑(或没有)“sort -u”作为选项。
【讨论】:
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。
【讨论】: