将VCF文件INFO列CSQ字段拆分至表格格式的技术需求
解决VCF中CSQ字段多转录本信息合并问题
针对你遇到的VCF文件CSQ字段多转录本信息无法全部保留、仅能提取首个转录本的问题,这里提供两种可行方案:
方案一:使用bcftools +split-vep(调整参数实现多转录本合并)
默认的bcftools +split-vep确实只保留首个转录本,但通过添加--merge comma参数,可以将同一变异下多个转录本的同字段值用逗号合并。
前提
确保你的VCF文件Header中包含CSQ字段的格式定义(VEP输出的VCF默认自带),例如:
##INFO=<ID=CSQ,Number=.,Type=String,Description="Consequence annotations from Ensembl VEP. Format: Allele|Consequence|...">
执行命令
bcftools +split-vep input.vcf \ -O t \ -o output.tsv \ --merge comma \ --fields CSQ \ --rename '%CHROM,%POS,%ID,%REF,%ALT,%QUAL,%FILTER,'%CSQ
参数说明:
-O t:输出TSV格式(方便查看和后续处理,若需VCF格式可改为-O v)--merge comma:指定多个转录本的同字段值用逗号连接--fields CSQ:明确拆分INFO中的CSQ字段--rename:定义输出列顺序,包含7个固定列和CSQ的82个子字段
方案二:Python脚本自定义处理(灵活适配特殊场景)
如果工具参数无法满足需求,可通过Python脚本手动解析并合并CSQ字段,这里用cyvcf2库(高效处理VCF)实现:
步骤1:安装依赖
pip install cyvcf2
步骤2:执行脚本
import cyvcf2 # 从VCF Header读取CSQ的子字段列表 vcf = cyvcf2.VCF("input.vcf") csq_desc = next(h for h in vcf.headers if 'ID=CSQ' in h) csq_fields = csq_desc.split('Format: ')[1].rstrip('">').split('|') # 定义输出表头 output_cols = ['Chromosome', 'Position', 'ID', 'Ref', 'Alt', 'Qual', 'Filter'] + csq_fields # 写入输出TSV with open('output.tsv', 'w') as out_file: out_file.write('\t'.join(output_cols) + '\n') for var in vcf: # 提取固定列数据,处理空值 chrom = var.CHROM pos = str(var.POS) var_id = var.ID if var.ID else '.' ref = var.REF alt = ','.join(var.ALT) qual = str(var.QUAL) if var.QUAL is not None else '.' filt = ','.join(var.FILTER) if var.FILTER else '.' # 解析CSQ字段 csq_raw = var.INFO.get('CSQ') if not csq_raw: # 无CSQ数据时填充空值 row = [chrom, pos, var_id, ref, alt, qual, filt] + ['']*len(csq_fields) out_file.write('\t'.join(row) + '\n') continue # 拆分所有转录本的CSQ数据 transcript_list = [t.split('|') for t in csq_raw.split(',')] # 按子字段合并,仅保留非空值并用逗号连接 merged_csq = [] for idx in range(len(csq_fields)): values = [t[idx] for t in transcript_list if t[idx]] merged_csq.append(','.join(values) if values else '') # 组装行并写入 final_row = [chrom, pos, var_id, ref, alt, qual, filt] + merged_csq out_file.write('\t'.join(final_row) + '\n')
脚本说明
- 自动从VCF Header读取CSQ的82个子字段定义,无需手动输入
- 处理空值时遵循VCF规范,用
.表示缺失数据 - 合并时自动过滤子字段的空值,仅保留有效信息
内容的提问来源于stack exchange,提问作者sunderv
相关产品推荐
相关产品推荐

