如何编写awk脚本实现实例名匹配并追加指定列数据?
用AWK实现双文件匹配与内容追加
问题说明
现有两个数据文件:
test.deg内容:
1 I0.XPDIN1 1.581e-01 1.507e-01 3.662e-04 3.891e-02 2 I0.XPXA1 1.577e-01 1.502e-01 3.653e-04 3.859e-02 3 I0.XPXA2 1.538e-01 1.444e-01 3.552e-04 3.471e-02
test.spf内容:
XPDIN1 XPDIN1#d XPDIN1#g XPDIN1#s VPP XPXA1 XPXA1#d XPXA1#g XPXA1#s VPP XPXA2 XPXA2#d XPXA2#g XPXA2#s VPP
需要编写AWK脚本完成以下操作:
- 提取
test.deg中I0.前缀后的实例名,与test.spf的首列实例名匹配 - 匹配成功后,将
test.deg对应行的第5列数值追加到test.spf对应行的末尾
示例匹配结果:XPDIN1 XPDIN1#d XPDIN1#g XPDIN1#s VPP 3.662e-04
AWK解决方案
脚本代码
创建脚本文件(比如merge.awk),内容如下:
NR == FNR { # 处理test.deg,提取实例名并存储第5列数据 sub(/^I0\./, "", $2) data[$2] = $5 next } # 处理test.spf,匹配并追加数据 { print $0, data[$1] }
执行命令
在终端运行:
awk -f merge.awk test.deg test.spf
逻辑解释
NR == FNR:仅在处理第一个输入文件(test.deg)时执行此块。NR是全局累计行号,FNR是当前文件的行号,两者相等时说明正在处理第一个文件。sub(/^I0\./, "", $2):移除$2字段开头的I0.前缀,得到纯实例名(比如把I0.XPDIN1转为XPDIN1)。data[$2] = $5:将实例名作为数组键,对应行的第5列数值存入数组,方便后续快速查找。next:跳过后续代码,直接处理下一行,避免第一个文件的行进入后续逻辑。- 处理第二个文件(
test.spf)时,直接打印当前行内容,再追加数组中对应首列实例名的数值。
输出结果
执行脚本后,输出内容为:
XPDIN1 XPDIN1#d XPDIN1#g XPDIN1#s VPP 3.662e-04 XPXA1 XPXA1#d XPXA1#g XPXA1#s VPP 3.653e-04 XPXA2 XPXA2#d XPXA2#g XPXA2#s VPP 3.552e-04
内容的提问来源于stack exchange,提问作者semiconductor kid
相关产品推荐
相关产品推荐

