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

如何使用awk筛选指定列重复次数恰好为2次的所有对应行

筛选id恰好出现2次行的awk正确写法

实现逻辑

要精准匹配id总出现次数恰好为2次的所有行,单次遍历无法实现:因为读取某一行时无法预知该id后续是否会再次出现,因此采用两次遍历文件的方案:

  • 第一次遍历全文件,统计每个id的总出现次数
  • 第二次遍历全文件,逐行判断当前行id的总次数是否为2,符合则输出

可直接运行的命令

awk -F';' 'NR==FNR{a[$1]++;next}a[$1]==2' data.file

参数与逻辑说明

  • -F';':指定字段分隔符为分号,适配当前文件格式
  • NR==FNR:awk内置判断逻辑,仅当读取第一个输入文件(此处为第一次读取目标文件)时条件成立
    • a[$1]++:以每行第一个字段(即id)为键,累加对应id的出现次数
    • next:跳过后续处理逻辑,直接读取下一行
  • 第一次遍历完成后进入第二次遍历,a[$1]==2为判断条件:若当前行id的总出现次数等于2,awk默认执行打印当前行的操作,无需额外写print $0

原有命令的问题

  • awk -F';' -v OFS=';' 'a[$1]++{print $0}' data.file:仅打印id重复出现的非首行,既无法排除出现3次及以上的id,还会漏掉每个重复id的第一行
  • awk -F';' -v OFS=';' '{a[$1]++; if (a[$1] == 2) {print $0}}' data.file:仅打印每个id的第二次出现行,既漏掉符合条件id的首行,也会错误输出出现3次及以上id的第二行(比如示例中出现3次的id=01的第二行会被误输出)

运行结果验证

使用提供的示例数据运行上述命令,输出完全符合要求:

02;Albert;Edinburgh;;19
02;Mark;;En;19
03;Raisa;Hellsinki;FI;22
03;Lisa;Hellsinki;;
05;Loris;Sicilia;;
05;Vera;Sicilia;;31

注:你给出的预期输出中03;Lisa|Hellsinki;;为笔误,源数据中该行为分号分隔,命令输出与源数据格式一致。


内容的提问来源于stack exchange,提问作者Andrés Chandía

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:21:35