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

求助:用Shell脚本实现跨文件匹配提取并修改文件内容

问题解决:匹配两个文件并替换内容

需求说明

现有两个文件,格式如下:

file1 内容:

place u_RX_WR_SE1_LS { } R0 -place
place u_bank_LS { } R0 -place 

file2 内容:

set inst RX_WR_SE1_PD ; add -inst $inst -cell PR ; place $inst  5.76    5305.84 0
set inst RX_WR_SE2_PD ; add -inst $inst -cell PR ; place $inst  5.76    5338.864    0
set inst bank_PD ;  add -inst $inst -cell PR ; place $inst  5.76    5371.888    0

需要完成的操作:

  • 从file1的第二字段中提取去掉前缀u_和后缀_LS后的内容(比如u_RX_WR_SE1_LS提取为RX_WR_SE1)
  • 在file2中搜索匹配该内容的行(匹配RX_WR_SE1_PD这类包含目标字符串的行)
  • 将file2对应行的第13、14字段的坐标值,替换到file1对应行的{ }中,得到期望输出:
place u_RX_WR_SE1_LS { 5.76 5305.84 } R0 -place
place u_bank_LS { 5.76  5371.888 } R0 -place 

原脚本问题分析

你之前的awk脚本没得到正确结果,核心问题是:

  • 只在数组里存了提取的key,没保存file1的原始行信息,无法输出修改后的原行格式
  • 逻辑顺序颠倒,应该先处理file2构建坐标映射,再处理file1做替换,而不是反过来遍历匹配
  • 输出的是零散拼接内容,不是符合要求的file1修改后格式

正确的awk实现方案

用下面的awk脚本可以完成需求:

# 先处理file2,构建"目标字符串->坐标"的映射数组
NR==FNR {
    # 提取inst名称,去掉后缀_PD
    inst_name = $3
    sub(/_PD$/, "", inst_name)
    # 存储坐标:第13、14字段
    coords[inst_name] = $13 " " $14
    next
}

# 处理file1,替换内容
{
    # 提取第二字段,去掉u_前缀和_LS后缀
    key = $2
    sub(/^u_/, "", key)
    sub(/_LS$/, "", key)
    # 替换{ }里的内容,如果有匹配的坐标就替换,否则保留空
    if (key in coords) {
        gsub(/\{ \}/, "{ " coords[key] " }")
    }
    # 输出修改后的行
    print $0
}

执行命令:

awk -f script.awk file2 file1

执行结果

运行后会输出符合要求的内容:

place u_RX_WR_SE1_LS { 5.76 5305.84 } R0 -place
place u_bank_LS { 5.76  5371.888 } R0 -place 

内容的提问来源于stack exchange,提问作者Shreya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:00:29