You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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脚本完成以下操作:

  1. 提取test.deg中I0.前缀后的实例名,与test.spf的首列实例名匹配
  2. 匹配成功后,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:57:20