首页 > 解决方案 > AWK - 在查找文件中查找数据并打印“成功”或“失败”

问题描述

无法确定我需要在 AWK 中实现的目标。我有 2 个文件:

数据文件:-

XYZ:ABC:tab1:join_check:abc111:abc.tab1234
XYZ:ABC:tab2:join_check:abc112:abc.tab1234
XYZ:ABC:tab3:join_check:abc113:abc.tab1234
XYZ:NON-ABC:tab1:join_check:abc123:abc.tab1234
XYZ:NON-ABC:tab2:join_check:abc123:abc.tab1234
HQL:ABC:tab1:join_check:abc123:abc.tab1234
HQL:NON-ABC:tab2:join_check:abc123:abc.tab1234
HQL:NON-ABC:tab3:join_check:abc123:abc.tab1234

查找文件:-

XYZ:ABC:tab1
XYZ:ABC:tab2
XYZ:NON-ABC:tab1
HQL:ABC:tab1
HQL:NON-ABC:tab2

期望的输出:-

XYZ:ABC:tab1:join_check:abc111:abc.tab1234:Verified
XYZ:ABC:tab2:join_check:abc112:abc.tab1234:Verified
XYZ:ABC:tab3:join_check:abc113:abc.tab1234:Failed
XYZ:NON-ABC:tab1:join_check:abc123:abc.tab1234:Verified
XYZ:NON-ABC:tab2:join_check:abc123:abc.tab1234:Failed
HQL:ABC:tab1:join_check:abc123:abc.tab1234:Verified
HQL:NON-ABC:tab2:join_check:abc123:abc.tab1234:Verified
HQL:NON-ABC:tab3:join_check:abc123:abc.tab1234:Failed

使用数据文件中的前 3 个字段,需要在查找文件中查找相同的三个字段。如果找到记录/条目(所有三个字段都匹配),需要从数据文件打印行并附加“已验证”,否则如果找不到记录/条目,需要从数据文件打印行并附加“失败”。

非常感谢您在这方面的任何帮助

标签: unixawk

解决方案


awk -F: -v OFS=: 'NR==FNR{lookup[$1":"$2":"$3]=1; next} {print $0, (lookup[$1":"$2":"$3] ? "Verified" : "Failed")}' lookup data

首先我们有两个代码块,第一个仅针对查找文件(第一个文件)执行,第二个仅针对数据文件(第二个文件)执行。这是通过检查 FNR(文件记录号)和 NR(总记录号)来完成的。这只对第一个文件是一样的,所以NR==FRN,然后我们跳到下一行使next用来防止第一个文件执行第二个块。

然后对于第二个文件,我们在查找关联数组中查找树字段,如果找到则选择“已验证”,如果未找到则使用三元运算符选择“失败”。

然后,我们使用该新字段打印整行 $0。我们分别设置字段分隔符和输出字段分隔符。与-F: -v OFS=:.


推荐阅读