在 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 apple 2 banana 1 orange - 解析:
uniq -c:显示每行出现的次数。- 结合
sort后,重复行会被相邻分组。
方法 2:仅显示重复行及其次数
sort filename | uniq -cd
- 输出示例:
3 apple 2 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_*; do
sort "$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 已足够高效!

478

被折叠的 条评论
为什么被折叠?



