You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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列标识,再匹配原文件输出完整行:

  1. 先提取并去重重复的前4列key:
awk -F',' '{print $1","$2","$3","$4}' record.txt | sort | uniq -D | uniq > duplicate_keys.txt
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:52:55