如何匹配文件1第二列与文件2条目并返回对应文件2第一列内容?
没问题,我来帮你搞定这个文本匹配的需求!这种跨文件的关联查询用awk工具最方便了,下面给你两种常见场景的解决方案,你可以根据自己的实际情况选择:
场景1:匹配file2的指定列(比如第二列)
假设你的文件结构是这样的:
file1内容示例:
user1 ABCD
user2 XYZ
user3 EFGH
file2内容示例:
ID007 WXYZ
ID003 ABCD
ID005 MNOP
如果要让file1的第二列和file2的第二列精确匹配,返回对应file2行的第一列,直接用这条命令:
awk 'NR==FNR {map[$2]=$1; next} $2 in map {print map[$2]}' file2 file1
命令解释:
NR==FNR:awk的内置变量,当处理第一个输入文件(这里是file2)时,这个条件成立map[$2]=$1:把file2的第二列内容作为键,对应行的第一列作为值,存入关联数组mapnext:跳过后续处理,继续处理file2的下一行- 当处理第二个文件file1时,检查它的第二列是否在
map的键中,如果存在,就打印对应的map值
运行上面的示例文件,输出会是:
ID003
场景2:匹配file2的任意列
如果file1的第二列内容可能出现在file2的任意一列中,只需要稍微修改命令,遍历file2的每一列存入数组:
awk 'NR==FNR {for(i=1;i<=NF;i++) map[$i]=$1; next} $2 in map {print map[$2]}' file2 file1
这个命令会把file2每一行的所有列内容都作为键,对应行的第一列作为值存入map,只要file1第二列的内容在file2的任何一列出现过,就返回对应的第一列。
额外说明
- 如果需要把结果保存到文件,只需要在命令末尾加重定向:
awk '...' file2 file1 > result.txt - 如果file2中有多个行匹配同一个内容,上面的命令会返回最后一次匹配的结果;如果需要返回所有匹配的结果,可以调整为把值存为数组,最后遍历输出,比如:
awk 'NR==FNR {for(i=1;i<=NF;i++) arr[$i]=arr[$i] $1 " "; next} $2 in arr {print arr[$2]}' file2 file1
内容的提问来源于stack exchange,提问作者Parth patel
相关产品推荐
相关产品推荐

