uniq 命令用于去除相邻的重复行。注意是"相邻"的重复行,所以通常需要先用 sort 排序。uniq 还可以统计重复次数,是数据分析的好帮手。
去除相邻的重复行:
uniq file.txt
因为只去除相邻重复,通常配合 sort 使用:
sort file.txt | uniq
| 选项 | 含义 |
|---|---|
-c | 统计每行出现的次数 |
-d | 只显示重复的行 |
-u | 只显示不重复的行 |
-i | 忽略大小写 |
-f N | 跳过前 N 个字段 |
-s N | 跳过前 N 个字符 |
-c 显示每行出现的次数:
sort file.txt | uniq -c
运行结果示例:
3 apple
2 banana
1 orange
数字表示该行出现的次数。
-d 只显示有重复的行:
sort file.txt | uniq -d
-u 只显示没有重复的行:
sort file.txt | uniq -u
-i 忽略大小写差异:
echo -e "Apple\napple\nAPPLE" | uniq -i
运行结果:
Apple
-f 跳过前 N 个字段,-s 跳过前 N 个字符:
cat data.txt
内容:
A 100
B 100
A 200
B 200
跳过第一个字段,按后面的内容去重:
uniq -f 1 data.txt
运行结果:
A 100
A 200
awk '{print $9}' access.log | sort | uniq -c | sort -rn
sort file.txt | uniq -d
sort file.txt | uniq -u
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
cat document.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn
find . -type f -exec md5sum {} \; | sort | uniq -d -w 32
-w 32 只比较前 32 个字符(MD5 哈希值长度)。
who | awk '{print $1}' | sort | uniq | wc -l
sort -u 等同于 sort | uniq:
sort -u file.txt
sort file.txt | uniq
两者效果相同,但 sort -u 更高效,因为只需要一次排序。
如果需要统计次数,必须用 uniq -c:
sort file.txt | uniq -c
必须先排序:uniq 只去除相邻的重复行,不排序可能达不到预期效果。
echo -e "a\nb\na" | uniq
echo -e "a\nb\na" | sort | uniq
运行结果:
a
b
a
a
b
空行也会被处理:连续的空行会被合并。
echo -e "a\n\n\nb" | uniq
运行结果:
a
b
-c 统计出现次数,-d 只显示重复行,-u 只显示唯一行-i 忽略大小写sort -u 等同于 sort | uniq,更高效