以下命令有什么区别?
sort -u FILE
sort FILE | uniq
答案 0 :(得分:75)
使用sort -u
的I / O比sort | uniq
少,但最终结果是相同的。特别是,如果文件足够大,sort
必须创建中间文件,sort -u
将使用稍微更少或略小的中间文件,因为它可以消除重复,因为它排序每个组。如果数据高度重复,这可能是有益的;如果事实上几乎没有重复,它将没有太大的区别(绝对是二阶性能效果,与管道的第一阶效应相比)。
请注意管道适当的时候。例如:
sort FILE | uniq -c | sort -n
这会将文件按文件中每行出现次数的顺序排序,最重复的行最后出现。 (我发现这种组合,对于Unix或POSIX来说是惯用的,可以用GNU排序压缩成一个复杂的'sort'命令,这并不奇怪。)
有时不使用管道很重要。例如:
sort -u -o FILE FILE
将文件“原位”排序;也就是说,输出文件由-o FILE
指定,并保证此操作安全(在覆盖输出之前读取文件)。
答案 1 :(得分:10)
有一点不同:返回代码。
问题是除非设置了shopt -o pipefail
,否则管道命令的返回码将是最后一个的返回码。 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
除此之外,命令是等效的。
答案 2 :(得分:8)
小心!虽然“sort -u”和“sort | uniq”是等价的,但排序的任何其他选项都可以打破等价。以下是coreutils手册中的一个示例:
例如,'sort -n -u'在检查唯一性时仅检查初始数字字符串的值,而'sort -n | uniq'检查整条线。
同样,如果对关键字段进行排序,则sort使用的唯一性测试不一定会查看整行。在被过去的那个bug咬了之后,这些天我倾向于在编写Bash脚本时使用“sort | uniq”。我宁愿拥有更高的I / O开销,也不愿意冒着商店里的其他人在修改我的代码以添加额外的排序参数时不知道该特定陷阱的风险。
答案 3 :(得分:6)
sort -u
会稍快一点,因为它不需要在两个命令之间输出输出
另见我对该主题的提问:calling uniq and sort in different orders in shell
答案 4 :(得分:2)
没什么,它们会产生相同的结果
答案 5 :(得分:1)
我曾在某些服务器上工作,其中sort不支持'-u'选项。我们必须使用
sort xyz | uniq