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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:55:05