使用bcftools从多样本VCF生成按样本分类的变异位点表格
VCF转换为按样本分组的变异列表解决方案
你使用的原命令是按变异位点遍历,单条位点行会输出所有样本的ID和对应基因型,因此会出现样本ID重叠的问题,以下是可直接落地的解决方案:
方案1:bcftools+awk组合方案(无额外工具依赖)
先通过bcftools过滤出所有样本携带非参考等位基因的变异位点,输出「样本ID-变异位点」的一一对应单行记录,再用awk按样本ID合并行,直接生成符合要求的表格:
# 输出空格分隔的结果,完全匹配你给出的示例格式 bcftools query -f '%SAMPLE\t%CHROM:%POS:%REF:%ALT_%GT\n' -i 'GT!="0/0" && GT!="./."' 输入文件.vcf.gz | \ awk '{a[$1] = a[$1] " " $2} END {for(i in a) print i a[i]}' > 输出结果.txt # 输出制表符分隔的tsv格式,更适合后续导入R分析 bcftools query -f '%SAMPLE\t%CHROM:%POS:%REF:%ALT_%GT\n' -i 'GT!="0/0" && GT!="./."' 输入文件.vcf.gz | \ awk '{if(a[$1]) a[$1] = a[$1] "\t" $2; else a[$1] = $2} END {for(i in a) print i "\t" a[i]}' > 输出结果.tsv
方案2:保留无变异样本的输出方案
如果需要把没有携带任何符合条件变异的样本也保留在输出结果中(单独占一行),可以先提取所有样本ID再合并结果:
# 提取全部样本ID存为临时文件 bcftools query -l 输入文件.vcf.gz > 样本列表.txt # 生成包含所有样本的结果文件 bcftools query -f '%SAMPLE\t%CHROM:%POS:%REF:%ALT_%GT\n' -i 'GT!="0/0" && GT!="./."' 输入文件.vcf.gz | \ awk '{if(a[$1]) a[$1] = a[$1] "\t" $2; else a[$1] = $2} END {while((getline < "样本列表.txt") > 0) {if($0 in a) print $0 "\t" a[$0]; else print $0}}' > 全样本输出结果.tsv
注意事项
- 如果你的VCF是分型相位明确的文件,可将过滤条件修改为
GT!="0|0" && GT!=".|."适配 - 输出的tsv文件导入R时可直接使用
read.table("输出结果.tsv", sep = "\t", header = F, fill = T),fill参数会自动补全不同样本变异位点数量不一致导致的空列
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

