我想知道 sort -u 和 uniq 之间的区别。我尝试使用下面的命令来获取文件中唯一字符串的计数,sort -u 和 uniq 根据我的知识提供了相同的输出。那为什么它提供了两个不同的计数。
cat test.txt | sort -u | wc -l
351
cat test.txt | uniq | wc -l
370
为什么它显示两个不同的行数?
答案1
严格来说,uniq
不需要排序输入 - 但确实uniq
只会删除连续的重复行。
不同之处在于:
sort
对文件进行排序,并且(使用其-u
选项)还可以消除重复的行,这些重复的行现在在排序后都是连续的。uniq
删除连续的重复行。它还具有仅输出重复行的选项(一每个与-d
, 或全部欺骗-D
),并且可以输出一行在输入 ( ) 中出现的次数-c
。它还具有其他选项来控制如何检测重复项,例如跳过字段和仅比较一行中的 N 个字符。sort
当然,uniq
如果您想结合两者的功能,可以通过管道输入的输出。
sort -u
当您不关心保留输入文件的顺序,或者实际上希望对其进行排序 - 但不希望输出中出现重复项时,它非常有用。
uniq
当需要保留输入顺序时,或者当您只关心连续的重复时,例如当您想要对已经排序的文件进行 uniq 时(无需浪费 CPU 和 IOPS 再次对其进行排序),这很有用;或者删除段落之间除一个连续换行符之外的所有内容(例如,pdftotext
通常在行或段落之间产生大量空白 -uniq
可以删除多余的内容,使其更易于阅读或编辑)。
答案2
uniq
需要输入已经排序。不按顺序出现的重复项不会被消除:
~ printf %s\\n 1 2 1 | uniq
1
2
1
~ printf %s\\n 1 2 1 | sort | uniq
1
2
~ printf %s\\n 1 2 1 | sort -u
1
2