uniq 去重

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

统计 IP 访问量

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

uniq vs sort -u

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

小结

  • uniq 去除相邻的重复行,通常配合 sort 使用
  • -c 统计出现次数,-d 只显示重复行,-u 只显示唯一行
  • -i 忽略大小写
  • sort -u 等同于 sort | uniq,更高效
  • 常用于日志分析和数据统计