Linux shell中的排序和uniq

问题描述:

以下命令与以下命令有什么区别?Linux shell中的排序和uniq

sort -u FILE 

sort FILE | uniq 
+0

当你跑他们,你看到了什么?您是否尝试收集不同大小文件的时间差异?您可以运行一些实验并发布结果是您问题的一部分。 – 2010-08-01 17:08:50

+0

我想知道是否有一个特殊情况是两个命令的行为不同,在正常执行中他们都给出了相同的结果 – yassin 2010-08-01 17:12:39

+3

[“sort -u”和“sort | uniq“?](http://unix.stackexchange.com/q/76049/17265) – mtk 2014-04-15 10:04:24

使用sort -usort | uniq少I/O,但最终结果是相同的。尤其是,如果文件足够大以至于sort必须创建中间文件,那么sort -u将使用略少或略小的中间文件,因为它可以消除重复,因为它会对每个文件集进行排序。如果数据高度重复,这可能是有益的;如果实际上有很少的重复,它不会产生太大的差别(绝对是二阶效果,与管道的一阶效应相比)。

请注意,有时管道是适当的。例如:

sort FILE | uniq -c | sort -n 

将文件按照文件中每行出现次数的顺序排序,最后出现最多重复的行。 (我不觉得这个组合是Unix还是POSIX的习惯用法,可以用GNU排序将它们压缩成一个复杂的“排序”命令。)

有时候不使用管道很重要。例如:

sort -u -o FILE FILE 

这样排序文件'in situ';即输出文件由-o FILE指定,并且此操作保证安全(文件在被覆盖输出前被读取)。

+0

感谢您的完整答案! – yassin 2010-08-01 17:31:12

+0

gnu sort没有办法完成'sort |的所有操作uniq -c | sort -n',而且我也没有找到任何其他工具来有效地完成它。似乎是一个有价值的代码。 – mc0e 2015-02-18 16:23:52

没有什么,他们会产生相同的结果

sort -u会更快略,因为它不需要管两个命令

之间的输出也看到题目我的问题:calling uniq and sort in different orders in shell

有一点区别:返回码。

问题是,除非设置了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 
+1

您是否愿意指定哪个服务器具有哪个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开销,也不愿冒着他们修改我的代码来添加额外的排序参数时,商店中的其他人不知道该特定陷阱的风险。