在Linux shell中sorting和uniq

下面的命令有什么区别?

sort -u FILE sort FILE | uniq 

使用'sort -u'比'sort |更less的I / O uniq',但最终的结果是一样的。 特别是,如果文件足够大以至于必须创build中间文件,那么“sort -u”将会使用稍微更less或更小的中间文件,因为它可以消除重复,因为它正在对每个文件集进行sorting。 如果数据是高度重复的,这可能是有益的; 如果实际上重复的次数很less,那么效果不会太大(相对于pipe道的一阶效果,二次效果的效果绝对是一样)。

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

 sort FILE | uniq -c | sort -n 

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

有时候不用pipe子很重要。 例如:

 sort -u -o FILE FILE 

这种文件“原位”。 也就是说,输出文件是由-o FILE指定的,并且这个操作是安全的(文件在被覆盖输出前被读取)。

有一点区别:返回码。

事情是,除非shopt -o pipefail被设置,pipe道命令的返回码将是最后一个的返回码。 而uniq总是返回零(成功)。 尝试检查退出代码,你会看到这样的事情( pipefail没有在这里设置):

 pavel@lonely ~ $ sort -u file_that_doesnt_exist ; echo $? sort: open failed: file_that_doesnt_exist: No such file or directory 2 pavel@lonely ~ $ sort file_that_doesnt_exist | uniq ; echo $? sort: open failed: file_that_doesnt_exist: No such file or directory 0 

除此之外,这些命令是等同的。

谨防! 尽pipe“sort -u”和“sort | uniq”是等价的,但是任何其他的sorting方法都可以打破等价。 下面是一个来自coreutils手册的例子:

例如,'sort -n -u'检查唯一性时只检查初始数字string的值,而'sort -n | uniq'检查整个线路。

同样,如果您在关键字段上进行sorting,sorting使用的唯一性testing不一定会查看整个行。 在过去被这个bug困扰之后,这些日子里,我倾向于在编写Bash脚本时使用“sort | uniq”。 我宁可有更高的I / O开销,而不是冒着他们修改我的代码来添加额外的sorting参数时,商店里的其他人不知道这个特定陷阱的风险。

sort -u会稍快一些,因为它不需要在两个命令之间输出输出

也看到我的问题在这个话题上: 调用uniq并在shell中按不同的顺序sorting

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

我曾经在一些不支持“-u”选项的服务器上工作。 那我们必须使用

 sort xyz | uniq