推荐sort -u而非sort | uniq,因其为原生命令、更省资源、容错性更强;支持-n(数值)、-f(忽略大小写)、-t(指定分隔符)等选项灵活去重。

直接用 sort -u 就行,不用再管 uniq。这是最简、最稳、最符合直觉的做法,99% 的去重排序需求一步到位。
为什么推荐 sort -u 而不是 sort | uniq
sort -u 和 sort file | uniq 表面效果一致,但底层逻辑和容错性不同:
-
sort -u是sort原生支持的去重模式,排序完成后直接丢弃重复项,不额外启动进程,更省资源 -
sort file | uniq多了一次管道和进程调度,对超大文件可能增加 I/O 和上下文切换开销 - 当输入含非法字节(如截断的 UTF-8)时,
uniq可能提前退出或报错,而sort -u更健壮(尤其加LC_ALL=C后) - 两者在默认 locale 下行为完全一致;但若需忽略大小写等,
sort -uf比sort -f | uniq -i更可靠——因为uniq -i仅影响比较,不保证排序阶段已归一化
sort -u 的常见变体与适用场景
去重只是基础,实际中常要配合排序逻辑调整:
- 纯文本去重(默认字典序):
sort -u data.txt - 按数字大小去重(防 "10" 排在 "2" 前):
sort -nu numbers.txt - 按第 2 列去重(如 CSV 中忽略 ID 列):
sort -t',' -k2,2 -u data.csv - 忽略大小写去重:
LC_ALL=C sort -uf data.txt(注意:必须加LC_ALL=C,否则-f在某些 locale 下会出错) - 逆序去重(最大值优先):
sort -ur data.txt
容易踩的坑:空格、制表符、不可见字符
看似相同的两行,sort -u 却没去重?大概率是隐形字符作祟:
- 行尾有空格或
\r(Windows 换行):先用sed 's/[[:space:]]*$//' file | sort -u - 字段间混用空格和制表符:用
-t $'\t'显式指定分隔符,或先统一替换tr '\t' ' ' - 编码不一致(如 UTF-8 vs GBK):强制用
LC_ALL=C sort -u避免 locale 解析歧义 - 想按“语义相同”去重(如 "apple " 和 "apple"),
sort -u不会自动 trim,必须预处理
真正麻烦的从来不是命令本身,而是数据里那些看不见的空格、换行、编码和 locale 设置。跑通 sort -u 很容易,让它在各种脏数据下稳定产出预期结果,才需要多看一眼输入。











