如何用awk基于另一文件字段值匹配搜索目标文件并输出结果?
问题
需求:以制表符分隔的文件f1的第7字段值为匹配项,在制表符分隔文件f2的第8字段中搜索。匹配成功时,输出f2的第1-4字段、该匹配值以及f2的第7字段对应的关联值;未匹配到则输出“Not found”。
现有awk脚本:
awk 'BEGIN {FS=OFS="\t"} NR==FNR {a[$1]=$7;next} $1 in a {v=a[$8]; print $1,$2,$3,$4,v,$7, "Not found"}' f1 f2
f1(制表符分隔)数据:
chr1 1013490 C G NM_005101.3 c.-84C>G ISG15 NM_005101 chr1 1013541 T C NM_005101.3 c.-33T>C ISG15 NM_005101 chr1 1022492 T G NM_198576.3 c.463+30T>G AGRN NM_198576 chr1 1022515 A C NM_198576.3 c.463+53A>C AGRN NM_198576
f2(制表符分隔)数据:
chr1 1013855 G A NM_005101.4 c.4-129G>A NM_005101 ISG15 chr1 1014274 A G NM_005101.4 c.294A>G NM_005101 ISG15 chr1 1014545 C T NM_005101.4 c.*5C>T NM_005101 ISG15 chr1 1022492 T G NM_198576.4 c.463+30T>G NM_198576 AGRN chr1 1022515 A C NM_198576.4 c.463+53A>CNM_198576 AGRN chr1 1022587 T TTGTAGTCTGACCTGTGGTCTGAC NM_198576.4 c.463+128_463+129insAGTCTGACCTGTGGTCTGACTGT NM_198576 AGRN chr1 2604062 A C NM_033467.4 c.951+85T>G NM_033467 MMEL1 chr1 2604065 A C NM_033467.4 c.951+82T>G NM_033467 MMEL1
期望输出(制表符分隔):
chr1 1013855 G A ISG15 NM_005101 chr1 1014274 A G ISG15 NM_005101 chr1 1014545 C T ISG15 NM_005101 chr1 1022492 T G AGRN NM_198576 chr1 1022515 A C AGRN NM_198576 chr1 1022587 T TTGTAGTCTGACCTGTGGTCTGAC AGRN NM_198576 chr1 2604062 A C MMEL1 Not found chr1 2604065 A C MMEL1 Not found
修正后的awk脚本
awk 'BEGIN {FS=OFS="\t"} NR==FNR { # 存储f1的关联关系:第7字段为键,第8字段为对应关联值 a[$7] = $8 next } { # 判断f2的第8字段是否在f1的匹配项集合中 if ($8 in a) { print $1, $2, $3, $4, $8, a[$8] } else { print $1, $2, $3, $4, $8, "Not found" } }' f1 f2
错误分析与修正说明
- 数组存储逻辑错误:原脚本用
a[$1]=$7,错误将f1的第1字段作为数组键,实际应把f1的第7字段(匹配项)作为键,存储对应的关联值(f1的第8字段)。 - 匹配判断逻辑错误:原脚本用
$1 in a判断匹配,实际应检查f2的第8字段是否存在于数组的键集合中,即$8 in a。 - 输出逻辑错误:原脚本错误输出了无关变量和多余的"Not found",匹配成功时需输出f2的1-4字段、f2的第8字段(匹配值)、数组中对应的关联值;未匹配时,最后一个字段替换为"Not found"。
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

