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

使用Awk脚本匹配制表符分隔文件中某列的逗号分隔ID

解决ID匹配的Awk脚本问题

需求说明

现有两个文件:

  • 制表符分隔的File1,第10列包含以逗号分隔的多个ID(前缀为orthologous_to=)
  • ID列表文件File2,每行一个目标ID

需要编写Awk脚本,匹配File1第10列中的任意ID是否存在于File2中,匹配成功则在该行末尾添加制表符分隔的ID_present标识,输出到Outfile。

示例文件

File1

KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707300.1     
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,RR2_000678900.1    
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,RR2_000678900.1,RR2_000567908.1    
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,KK2_0007890345.1    

File2

KK2_0006707310.1
KK2_0006707300.1

期望输出Outfile

KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707300.1     ID_present
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,RR2_000678900.1    ID_present
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,RR2_000678900.1,RR2_000567908.1    ID_present
KK2        62652   63579   m64204e     -       polypeptide     61932   64190   A_KK2_000063400 orthologous_to=KK2_0006707310.1,KK2_0007890345.1    ID_present

待修正的Awk脚本

awk 'BEGIN {FS="\t,"} {OFS="\t"} NR==FNR {a[$10]=$1 ; b[$10]=$2; c[$10]=$3; d[$1]=$n; next} {if ($1 in a) {print $0, "ID_present} else {print $0, "#N/A"} }' file2 file1 > outfile

修正后的Awk脚本

awk 'BEGIN {FS="\t"; OFS="\t"} 
NR==FNR {
    if ($1 != "") ids[$1] = 1  # 跳过File2中的空行
    next
}
{
    flag = 0
    # 提取第10列中等号后的ID部分,按逗号分割成数组
    split(substr($10, index($10, "=")+1), id_list, ",")
    # 遍历所有ID,检查是否在目标列表中
    for (i in id_list) {
        if (id_list[i] in ids) {
            flag = 1
            break
        }
    }
    if (flag) print $0, "ID_present"
    # 若需要保留不匹配的行,可添加else分支:else print $0, "#N/A"
}' File2 File1 > Outfile

原脚本错误分析

  1. 分隔符设置错误:原脚本FS="\t,"将制表符加逗号作为分隔符,不符合File1制表符分隔、第10列内部逗号分隔的规则,正确FS应设为\t。
  2. File2处理逻辑错误:读取File2时错误使用$10(File2仅1列),还冗余定义了多个无用数组,正确操作是将每行ID存入标记数组。
  3. 匹配逻辑错误:原脚本用$1 in a进行匹配,完全偏离了“匹配File1第10列中ID”的需求,需提取第10列的ID逐个检查。
  4. 语法错误:print $0, "ID_present缺少闭合引号,属于语法错误。
  5. 空行未过滤:未处理File2中的空行,会导致无效匹配项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:52:06