如何使用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
相关产品推荐
相关产品推荐

