Linux删除文件重复行需区分相邻与全局重复:uniq仅处理相邻重复,故常用sort+uniq组合;保留原序则用awk;还可按列、忽略大小写或空格去重,并支持提取重复/唯一行及统计频次。

Linux 删除文件中的重复行,核心在于区分“相邻重复”和“全局重复”。uniq 命令本身只处理相邻重复行,所以直接用 uniq file.txt 往往无效——除非文件原本就已排序。真正实用的去重,基本靠组合或替代工具实现。
先排序再去重(最常用)
这是最稳妥、兼容性最好的方式,适合大多数场景:
-
sort file.txt | uniq > unique.txt:排序后去重,保留每种内容的第一行 -
sort -u file.txt > unique.txt:sort -u是等效简写,一步到位 -
sort -f file.txt | uniq -i > unique.txt:忽略大小写去重(-f和-i都可实现,推荐用sort -f统一处理) -
sort -k2,2 file.txt | uniq -w10:按第2列排序,再比较每行前10个字符是否重复(适用于固定格式日志)
不排序直接去重(保留原始顺序)
当必须维持原文件行序(比如配置项顺序不能变),用 awk 最可靠:
-
awk '!seen[$0]++' file.txt > unique.txt:逐行读取,首次出现即输出,后续重复跳过 -
awk '!seen[tolower($0)]++' file.txt:转小写后再判断,实现忽略大小写的全局去重 -
awk '{line = $0; gsub(/^[[:space:]]+|[[:space:]]+$/, "", line)} !seen[line]++' file.txt:先去掉首尾空格再比对,避免空格导致误判
只提取重复行或唯一行
不是删除,而是筛选出特定类型行,常用于分析或调试:
-
sort file.txt | uniq -d:列出所有至少出现两次的行(每种只列一次) -
sort file.txt | uniq -D:列出所有重复行的全部出现(含多次) -
sort file.txt | uniq -u:只输出出现恰好一次的行 -
sort file.txt | uniq -c | sort -nr:统计每行出现次数,并按频次降序排列
按列去重(跳过字段或部分字符)
适用于 CSV、日志或带分隔符的结构化文本:
-
sort -t',' -k1,1 file.csv | uniq -w10:按逗号分隔,仅看第1字段的前10字符去重 -
awk -F',' '!seen[$1]++' file.csv:以逗号为分隔符,按第1列去重(保留首次出现的整行) -
sort file.txt | uniq -f 1:比较时跳过每行开头第一个字段(如忽略 IP 后的访问时间) -
sort file.txt | uniq -s 5:跳过每行前5个字符再比较(适合对齐日志中固定前缀)


















