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

