最可靠方式是先排序再去重,因uniq仅处理相邻重复行;正确命令为sort file.txt | uniq,或简写为sort -u file.txt,后者等效但会改变原始顺序。

Linux 中过滤文件重复行,最可靠的方式是 先排序再去重,因为核心工具 uniq 只能处理相邻重复行,不能直接处理分散在各处的重复内容。
必须先用 sort 排序
uniq 不会自动排序,它只对比当前行和上一行是否相同。如果重复行不挨着,uniq 就会把它们当作不同行保留下来。
- 错误示范(不排序直接用 uniq):
uniq file.txt→ 多个 Alice 分散出现,仍全部输出 - 正确做法:
sort file.txt | uniq→ 所有 Alice 被归到一起,uniq 才能合并为一行 - 想保存结果到新文件?加重定向:
sort file.txt | uniq > unique.txt
常用去重组合与效果
根据需求选择不同命令组合:
-
只要唯一行(默认行为):
sort file.txt | uniq -
统计每行出现次数(适合日志分析):
sort file.txt | uniq -c→ 输出类似3 Alice -
只看哪些行重复了(每组重复行只显示一次):
sort file.txt | uniq -d -
只保留从未重复过的行:
sort file.txt | uniq -u
更简洁的替代方案:sort -u
如果目标只是去重,不关心排序顺序或统计,sort -u 是一条命令搞定的快捷方式:
-
sort -u file.txt→ 等效于sort file.txt | uniq - 支持额外选项,比如按数字排序去重:
sort -nu file.txt - 注意:
sort -u会改变原始顺序,输出按字典/数值序排列
进阶:跳过字段或忽略大小写
当重复判断需忽略某些部分时,uniq 提供针对性选项:
- 每行开头有编号或时间戳?跳过前 N 字段:
sort -k2,2 file.txt | uniq -f 1(跳过第 1 字段,按第 2 字段去重) - 日志中 IP 地址重复但大小写混用?加
-i:awk '{print $1}' access.log | sort -f | uniq -i - 只想比对每行前 10 个字符?用
-w 10


















