如何实现将File1中匹配File2第一列的内容替换为第二列值?
问题描述
现有两个文件:
File 1
Create -l Ap -ne BP_v BP_v -cir {1 2 3 4} Create -l Ap -ne BP_p BP_p -cir {1 2 3 4}
File 2
BP_v net1 BP_p net2
需求是在File1中查找与File2第一列匹配的内容,找到后替换为File2对应行的第二列内容,期望输出:
Create -l Ap -ne net1 net1 -cir {1 2 3 4} Create -l Ap -ne net2 net2 -cir {1 2 3 4}
尝试过以下awk代码,但它是按行号匹配替换,无法实现需求:
awk 'NR==FNR{a[NR]=$1;b[NR]=$2;next}{$5=b[FNR];$6=b[FNR]}1' File 2 File 1
解决方案
用键值对映射的方式处理即可,正确的awk命令如下:
awk 'NR==FNR {map[$1]=$2; next} {for(i=1; i<=NF; i++) if($i in map) $i=map[$i]} 1' File2 File1
逻辑说明:
NR==FNR:仅处理第一个输入文件(File2),将第一列作为键、第二列作为值存入关联数组map。next:跳过当前行的后续处理,直接读取下一行。- 处理File1时,遍历每行的每个字段,若字段存在于
map的键集合中,就将该字段替换为对应的map值。 1:awk的简写语法,等价于print $0,用于输出修改后的整行内容。
这种方式不受行顺序、匹配字段位置的限制,能精准替换所有符合条件的字段。
内容的提问来源于stack exchange,提问作者Shreya
相关产品推荐
相关产品推荐

