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

如何用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

错误分析与修正说明

  1. 数组存储逻辑错误:原脚本用a[$1]=$7,错误将f1的第1字段作为数组键,实际应把f1的第7字段(匹配项)作为键,存储对应的关联值(f1的第8字段)。
  2. 匹配判断逻辑错误:原脚本用$1 in a判断匹配,实际应检查f2的第8字段是否存在于数组的键集合中,即$8 in a。
  3. 输出逻辑错误:原脚本错误输出了无关变量和多余的"Not found",匹配成功时需输出f2的1-4字段、f2的第8字段(匹配值)、数组中对应的关联值;未匹配时,最后一个字段替换为"Not found"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:15:57