Bash
“sort -u”和“sort | uniq”有什麼區別?
我到處看到有人需要得到一個排序的、唯一的列表,他們總是通過管道傳輸到
sort | uniq
. 我從未見過有人使用的任何範例sort -u
。為什麼不?有什麼區別,為什麼使用 uniq 比使用唯一標誌進行排序更好?
sort | uniq
以前存在sort -u
,並且與更廣泛的系統兼容,儘管幾乎所有現代系統都支持-u
——它是 POSIX。這主要是對不存在的日子的回歸sort -u
(如果他們知道的方式繼續有效,人們不會傾向於改變他們的方法,只需看看ifconfig
與ip
採用的對比)。兩者很可能合併,因為刪除文件中的重複項需要排序(至少在標準情況下),並且是排序的一個極其常見的案例。由於能夠同時執行這兩個操作(並且由於它不需要在 和 之間進行 IPC),因此它在內部也
uniq
更快sort
。特別是如果文件很大,sort -u
可能會使用更少的中間文件來對數據進行排序。在我的系統上,我一直得到這樣的結果:
$ dd if=/dev/urandom of=/dev/shm/file bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 8.95208 s, 11.7 MB/s $ time sort -u /dev/shm/file >/dev/null real 0m0.500s user 0m0.767s sys 0m0.167s $ time sort /dev/shm/file | uniq >/dev/null real 0m0.772s user 0m1.137s sys 0m0.273s
它也不會掩蓋 的返回碼
sort
,這可能很重要(在現代 shell 中,有一些方法可以得到它,例如bash
’s$PIPESTATUS
數組,但這並不總是正確的)。