在shell中以不同的顺序调用uniq和sort

3
在shell脚本中调用uniqsort命令时,它们的先后顺序是否会影响时间和空间效率呢?
grep 'somePattern' | uniq | sort

对比。

grep 'somePattern' | sort | uniq

对于一个包含140k行的文本文件,进行了快速测试,第一种方法(获取唯一值然后排序)表现出略微的速度提升(5.5秒 vs 5.0秒)。

但我不知道如何测量内存使用情况...

现在的问题是:顺序是否有影响?还是取决于grep返回的行数(有/无重复)?


1
我谦虚地建议接受一个不同的答案——sort -u是比你们任何一种替代方案都更正确的方法。 - DVK
当然可以,但是被接受的答案更好地解释了为什么。 - knittl
3个回答

10

我认为sort -u非常适合这种情况,它可以同时排序和去重。 显然,这比按任意顺序单独调用sortuniq要更有效率。


1
“sort -u” 是一个很好的提示,毫无疑问,它比调用两个命令更有效率。但是,命令的顺序是有区别的(uniq | sort 不起作用)。 - knittl
在一个快速测试中,我发现sort -usort|uniq快约7%。 - Dennis Williamson

9
唯一正确的顺序是在调用“sort”之后再调用“uniq”,因为“uniq”的man页面上写道:

从输入(或标准输入)中丢弃除连续相同行之外的所有内容,并将其写入输出(或标准输出)。

因此应该这样做:
grep 'somePattern' | sort | uniq

1
我曾经在从排序文件中grep数GB的内容时使用了| uniq | sort | uniq,只是为了尽量减少排序需要处理的数据量。 - Shizzmo

3

uniq依赖于排序后的项来删除重复项(因为它会比较前一个和当前的项),这就是为什么在uniq之前总是运行sort的原因。试一下就知道了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接