基于ref文件匹配更新main文件列的awk脚本问题求助
问题:基于参考文件匹配修改目标文件内容
需求:使用参考文件ref的第2列作为匹配条件,修改目标文件main中匹配行的第1列(添加+前缀),并将结果输出至out文件。
示例文件
ref文件
PSHELL 216 136738 PSHELL 217 136738 PSHELL 1786 13571 PSHELL 1605 136513
main文件
PSHELL 216 136738 PSHELL 218 136738 PSHELL 1786 13571 PSHELL 1610 136513 PSHELL 1612 136513
期望输出out文件
+PSHELL 216 136738 PSHELL 218 136738 +PSHELL 1786 13571 PSHELL 1610 136513 PSHELL 1612 136513
我的错误代码
awk ' FNR == NR { # if record from 1st file item[++n] = $2 # store in indexed item array next # skip to next record } { main[++m] = $0 } # for 2nd file, store record in main END { # after all records processed for (i=1; i<=n; i++) # loop over all items for(j=1; j<=m; j++) { # loop over each record in main line = main[j] # save record in line if (j == 2) # if 2nd record in main [$2]=+[$2] print line >> item[i] # append line to item file } } ' ref main > out
错误信息
line 11: 语法错误
问题分析与修正代码
原代码逻辑完全偏离需求,且存在多处语法错误:
[$2]=+[$2]是无效的awk语法,与需求逻辑完全不符;- 错误将main文件内容存入数组后做嵌套循环,输出逻辑
print line >> item[i]会尝试写入以ref第2列为文件名的文件,而非输出到out; - 未实现"匹配ref第2列后修改main行第1列"的核心逻辑。
修正后的代码,采用关联数组实现快速匹配:
awk ' # 处理第一个文件ref,将第2列存入关联数组 FNR == NR { match_ids[$2] = 1 next } # 处理第二个文件main { # 如果当前行第2列在匹配数组中,给第1列加+前缀 if ($2 in match_ids) { $1 = "+" $1 } # 输出修改后的行 print $0 } ' ref main > out
代码说明:
FNR == NR:awk处理多文件时,FNR是当前文件的行号,NR是全局行号,两者相等时处理第一个文件(ref);match_ids[$2] = 1:将ref的第2列作为关联数组的键,值设为1,用于后续快速查找;- 处理main文件时,判断当前行第2列是否在
match_ids数组中,是则修改第1列,然后输出整行。
内容的提问来源于stack exchange,提问作者EverLearner
相关产品推荐
相关产品推荐

