如何在Snakemake规则中用循环批量传入MakeVcfSampleNameMap的INPUT参数?
解决Snakemake中批量运行GATK MakeVcfSampleNameMap的方案
由于gatk MakeVcfSampleNameMap仅支持单次传入一个--INPUT参数,我们可以通过拆分两步实现批量处理:先为每个VCF单独生成临时映射文件,再合并所有临时文件得到最终的sample_name_map.txt。
1. 匹配输入VCF文件
先通过Snakemake的文件匹配功能,获取input/目录下的所有目标VCF文件:
# 根据实际VCF后缀调整匹配规则,比如.vcf.gz VCFS = glob_wildcards("input/{sample}.vcf").sample
2. 编写单个VCF处理规则
创建规则为每个VCF生成独立的临时映射文件,避免手动逐个指定输入:
rule make_single_sample_map: input: vcf = "input/{sample}.vcf" output: tmp_map = "tmp/{sample}.map.txt" shell: """ gatk MakeVcfSampleNameMap \ --INPUT {input.vcf} \ --OUTPUT {output.tmp_map} """
3. 合并临时文件生成最终映射
编写规则等待所有临时文件生成后,合并得到最终的制表符分隔文件:
rule make_final_sample_map: input: tmp_maps = expand("tmp/{sample}.map.txt", sample=VCFS) output: final_map = "sample_name_map.txt" shell: """ # 若工具生成表头,保留第一份表头再合并其余内容 head -n 1 {input.tmp_maps[0]} > {output.final_map} tail -n +2 {input.tmp_maps} >> {output.final_map} # 若工具无表头,直接合并即可: # cat {input.tmp_maps} > {output.final_map} """
额外注意事项
- 提前创建
tmp/目录,可在工作流开头添加shell: "mkdir -p tmp",或用directory("tmp")声明目录依赖。 - 若VCF文件名格式特殊,调整
glob_wildcards的匹配模式即可(比如input/{batch}_{sample}.vcf.gz对应glob_wildcards("input/{batch}_{sample}.vcf.gz").sample)。 - 如需修改映射内容(比如重命名样本),可在单个规则的shell命令中添加
awk等工具处理后输出到临时文件。
内容的提问来源于stack exchange,提问作者K. Wamae
相关产品推荐
相关产品推荐

