Linux shell中的排序和uniq
使用sort -u
比sort | uniq
少I/O,但最终结果是相同的。尤其是,如果文件足够大以至于sort
必须创建中间文件,那么sort -u
将使用略少或略小的中间文件,因为它可以消除重复,因为它会对每个文件集进行排序。如果数据高度重复,这可能是有益的;如果实际上有很少的重复,它不会产生太大的差别(绝对是二阶效果,与管道的一阶效应相比)。
请注意,有时管道是适当的。例如:
sort FILE | uniq -c | sort -n
将文件按照文件中每行出现次数的顺序排序,最后出现最多重复的行。 (我不觉得这个组合是Unix还是POSIX的习惯用法,可以用GNU排序将它们压缩成一个复杂的“排序”命令。)
有时候不使用管道很重要。例如:
sort -u -o FILE FILE
这样排序文件'in situ';即输出文件由-o FILE
指定,并且此操作保证安全(文件在被覆盖输出前被读取)。
没有什么,他们会产生相同的结果
有一点区别:返回码。
问题是,除非设置了shopt -o pipefail
,否则管道命令的返回码将是最后一个的返回码。并且uniq
总是返回零(成功)。尝试检查退出代码,你会看到这样的事情(pipefail
此处未设置):
[email protected] ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
[email protected] ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0
除此之外,该命令是等价的。
我曾在一些服务器上排序不支持'-u'选项。我们必须使用
sort xyz | uniq
您是否愿意指定哪个服务器具有哪个o/s版本以及何时?第七版UNIX™'sort'支持'-u',这是第一个被广泛使用的UNIX版本,因此所有其他版本(系统III,系统V,BSD等)都倾向于遵循它,所以我会很惊讶找到'sort'不支持'-u'的类Unix系统。 – 2012-12-27 15:05:09
当心!尽管“sort -u”和“sort | uniq”是等价的,但是排序的其他选项可能会打破等价。下面是coreutils手册中的一个示例:
例如,'sort -n -u'在检查唯一性时仅检查初始数字字符串的值,而'sort -n | uniq'检查整条生产线。
同样,如果您在关键字段上排序,排序使用的唯一性测试不一定会看到整个行。在过去被这个错误困扰之后,这些日子我倾向于在编写Bash脚本时使用“sort | uniq”。我宁愿有更高的I/O开销,也不愿冒着他们修改我的代码来添加额外的排序参数时,商店中的其他人不知道该特定陷阱的风险。
当你跑他们,你看到了什么?您是否尝试收集不同大小文件的时间差异?您可以运行一些实验并发布结果是您问题的一部分。 – 2010-08-01 17:08:50
我想知道是否有一个特殊情况是两个命令的行为不同,在正常执行中他们都给出了相同的结果 – yassin 2010-08-01 17:12:39
[“sort -u”和“sort | uniq“?](http://unix.stackexchange.com/q/76049/17265) – mtk 2014-04-15 10:04:24