求助:用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
相关产品推荐
相关产品推荐

