如何使用awk对比两个文件的多列字段筛选符合匹配规则的记录
跨文件字段匹配awk命令修复
匹配规则
需同时满足以下条件,才输出file1的对应记录:
- file2对应记录的col4字段值为TRUE
- file1的col3字段值与file2的col3字段值一致
- file1的col1字段前2个字符,与file2的col1字段值相等
原命令错误点
原命令无法得到预期结果,共有3处核心问题:
- 文件读取顺序颠倒:
NR==FNR代码块会优先处理传入的第一个文件,原命令先传入file1,将file1内容存入数组,但实际逻辑需要先读取file2的有效规则,再匹配file1内容。 - 字符串判断未加引号:
$4==TRUE中TRUE是字符串值,未加双引号时awk会将其识别为未初始化的空变量,永远无法匹配到值为TRUE的记录。 - 匹配逻辑错位:原命令存储数组时使用file1的字段生成键,处理file2时反向查询,和需求逻辑完全相反;且未在读取file2时提前过滤col4为TRUE的记录,会将无效规则纳入匹配范围。
修复后命令
awk -F'|' 'BEGIN{OFS=FS} NR==FNR { if ($4 == "TRUE") { a[$1,$3] = 1 } next } (substr($1,1,2), $3) in a { print $0 } ' file2 file1 > outfield
逻辑说明
- 优先处理第一个传入的file2:逐行校验col4是否为
TRUE,符合条件的记录,将「col1值+col3值」作为有效键存入数组,所有file2记录处理完成后再执行后续逻辑。 - 再处理第二个传入的file1:逐行截取col1的前2位字符,和当前行col3拼成组合键,查询该键是否存在于之前存储的有效规则数组中,存在则打印当前整行记录。
样例运行结果
使用提供的样例数据执行上述命令,输出与预期完全一致:
AE1267453617238|BIDKFXXXX|United Arab Emirates|
内容的提问来源于stack exchange,提问作者Nadia Alice
相关产品推荐
相关产品推荐

