AWK行匹配与字段修改求助:无法将file1的$7赋值到file2的$7
问题分析与修正方案
我一眼就揪出了你AWK代码里的核心问题——处理file2时,用来取值的键和判断存在性的键完全不匹配!
咱们拆解下逻辑:
- 读取file1时,你用
substr($1,0,10) FS $2作为键,把$7的值存在values数组里 - 处理file2时,你判断的是
(substr($5,0,10) FS $6)是否在values中,但赋值时却错误地用了values[substr($1,0,10) FS $2]——这俩键根本不是一回事,自然取不到对应的值,导致$7字段赋值失效。
之前赋值到$3时能正常运行,大概率是你当时碰巧用对了匹配的键,改到$7时手滑搞错了。
修正后的代码
BEGIN {FS=OFS="\t"} NR == FNR { values[substr($1,0,10) FS $2] = $7; next } (substr($5,0,10) FS $6) in values { $7 = values[substr($5,0,10) FS $6] # 这里改成和判断条件一致的键 }1
关键修正细节
把赋值语句里的substr($1,0,10) FS $2替换成substr($5,0,10) FS $6,这样就能用file2中用来匹配的键,正确取出file1里存储的对应$7值,赋值给file2的$7字段。
另外补充个小规范:AWK的substr函数起始位置多数实现是从1开始的,substr($1,0,10)虽然很多场景下能运行,但更严谨的写法是substr($1,1,10),避免在严格的AWK版本中出问题。
内容的提问来源于stack exchange,提问作者user3746195
相关产品推荐
相关产品推荐

