如何用Awk命令查找文件中前4列重复的完整记录
解决方法
要获取前4列重复的完整行,你可以用以下几种高效的命令实现:
方法一:单Awk命令一次性处理
直接用Awk统计前4列的重复次数,并存储对应行,最后输出重复组的所有行:
awk -F',' '{key = $1 FS $2 FS $3 FS $4; rows[key] = rows[key] $0 "\n"; count[key]++} END{for (k in count) if (count[k] > 1) printf "%s", rows[k]}' record.txt
思路:
- 用
key变量拼接前4列作为唯一标识 rows[key]存储同一个key对应的所有完整行count[key]统计每个key的出现次数- 最后遍历所有key,仅输出出现次数大于1的key对应的所有行
方法二:结合Uniq和Awk分步处理
先提取重复的前4列标识,再匹配原文件输出完整行:
- 先提取并去重重复的前4列key:
awk -F',' '{print $1","$2","$3","$4}' record.txt | sort | uniq -D | uniq > duplicate_keys.txt
- 用Awk读取
duplicate_keys.txt,匹配原文件输出对应完整行:
awk -F',' 'NR==FNR{keys[$0]=1; next} {key=$1","$2","$3","$4; if(keys[key]) print $0}' duplicate_keys.txt record.txt
思路:
- 第一步先筛选出所有重复的前4列组合(去重后避免重复匹配)
- 第二步用Awk加载这些重复key,遍历原文件时输出匹配的完整行
方法三:排序后用Awk连续匹配
先按前4列排序,再用Awk对比前后行的key,输出重复组:
sort -t',' -k1,4 record.txt | awk -F',' ' {current_key = $1 FS $2 FS $3 FS $4} current_key != prev_key { if (line_count > 1) { for (i=1; i<=line_count; i++) print stored_lines[i] } line_count = 0 prev_key = current_key } {line_count++; stored_lines[line_count] = $0} END{ if (line_count > 1) { for (i=1; i<=line_count; i++) print stored_lines[i] } } '
思路:
- 先按前4列排序,让相同key的行连续排列
- 用Awk遍历排序后的内容,存储当前key的所有行
- 当遇到新key时,检查之前存储的行数量,大于1则全部输出
- 最后处理文件末尾的最后一组行
内容的提问来源于stack exchange,提问作者Kisses
相关产品推荐
相关产品推荐

