Linux从入门到荒废-查找文件中重复的数据
在 Linux 中,可以通过多种命令和组合快速找出文件中的重复数据。以下是几种常用方法,按场景分类:
1. 直接显示重复的行(无需统计次数)
方法 1:sort
+ uniq
sort filename | uniq -d
- 作用:输出文件中所有重复的行(每行至少出现两次)。
- 解析:
sort
:将文件内容排序,使相同行相邻。uniq -d
:仅输出重复的行。
方法 2:awk
(不依赖排序)
awk 'seen[$0]++ == 1' filename
- 作用:直接输出重复行,不要求文件预先排序。
- 解析:
seen[$0]++
:用哈希表记录每行出现的次数,当某行第二次出现时(==1
),触发输出。
2. 显示重复行及其重复次数
方法 1:统计所有行的重复次数
sort filename | uniq -c
- 输出示例:
3 apple2 banana1 orange
- 解析:
uniq -c
:显示每行出现的次数。- 结合
sort
后,重复行会被相邻分组。
方法 2:仅显示重复行及其次数
sort filename | uniq -cd
- 输出示例:
3 apple2 banana
- 解析:
uniq -cd
:仅输出重复次数大于等于 2 的行。
方法 3:使用 awk
输出重复次数
awk '{count[$0]++} END {for (line in count) if (count[line]>1) print count[line], line}' filename
- 输出示例:
3 apple 2 banana
- 解析:
count[$0]++
:记录每行的出现次数。END
块:遍历所有行,输出重复次数和对应的行。
3. 处理大文件(高效内存优化)
方法 1:分割文件后处理
split -l 1000000 largefile.txt chunk_ # 将大文件分割为小文件
for file in chunk_*; dosort "$file" | uniq -d >> duplicates.txt
done
- 适用场景:文件极大,单次处理内存不足。
方法 2:使用 mawk
(更快的 awk
实现)
mawk '{count[$0]++} END {for (line in count) if (count[line]>1) print line}' largefile.txt
- 优势:
mawk
速度比 GNUawk
更快,适合处理大文件。
4. 扩展需求
忽略大小写
sort -f filename | uniq -id # -f 忽略大小写排序,-i 忽略大小写比较
仅显示重复行的首次出现位置
awk '!seen[$0]++ && seen[$0]>1' filename
删除重复行,保留唯一值
sort -u filename > unique.txt # 直接去重
总结
场景 | 命令 |
---|---|
快速显示重复行 | `sort file |
显示重复行及次数 | `sort file |
不排序直接找重复行 | awk 'seen[$0]++ == 1' file |
大文件处理 | split + 分块处理,或使用 mawk |
忽略大小写 | `sort -f file |
根据实际需求选择方法,多数场景下 sort | uniq -d
已足够高效!