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

Snakemake expand结合zip使用时通配符解析异常问题

问题根因

你遇到的通配符错配问题和expand()的zip参数无关,zip已经正确生成了一一配对的目标路径,核心错误是将两个通配符直接相邻拼接、中间没有任何固定分隔符。
Snakemake解析通配符时基于正则匹配,当两个通配符之间没有固定字符串作为边界时,程序无法自动判定两个通配符的分割位置,只要拆分结果能拼出完整目标路径就会被判定为合法匹配,因此会出现你看到的截断错配:比如对路径rnaquast/TMW3250_15German_ale/short_report.txt,程序可以将{sample}匹配为TMW3250_15German_al、{reference}匹配为e,完全符合无分隔符的路径模式,但和你预期的取值完全不符。

修复方法

在{sample}和{reference}两个通配符之间添加一个不会出现在两组取值中的固定分隔符(如下划线、短横线),给Snakemake明确的匹配边界即可,修改点涉及三处逻辑:

  1. rule all中expand()的路径模板
  2. rule rnaQUAST中output的路径模板
  3. 对应shell命令中输出目录的拼接逻辑也要同步修改

修正后的核心代码如下:

samples_rnaQUAST = ["TMW3250_15","TMW3250_20","TMW3256_15","TMW3256_20","TMW3261_15","TMW3261_20",
                    "TMW3673_15","TMW3673_20","TMW3285_15","TMW3285_20","TMW3275_15","TMW3275_20",
                    "TMW3681_15","TMW3681_20","TMW3287_15","TMW3287_20"]
references_rnaQUAST = ["German_ale","German_ale","German_ale","German_ale",
                       "English_ale","English_ale","American_ale","American_ale",
                       "Frohberg","Frohberg","Frohberg","Frohberg","Saaz",
                       "Saaz","Saaz","Saaz"]

rule all:
    input:
        # 两个通配符间添加下划线作为固定分隔符
        expand("rnaquast/{sample}_{reference}/short_report.txt", zip, sample=samples_rnaQUAST, reference=references_rnaQUAST)

rule rnaQUAST:
    input:
        transcriptome="trinity/{sample}/default_by_condition_trinity/Trinity.fasta",
        reference="genomes/{reference}_genome.fasta",
        gtf="genomes/AUGUSTUS_annotations/{reference}.gtf"
    output:
        # 输出路径和rule all模板保持一致,添加相同分隔符
        report="rnaquast/{sample}_{reference}/short_report.txt"
    threads: 16
    shell:"""
    /home/user/miniconda3/envs/rnaquast/share/rnaquast-1.5.1-0/rnaQUAST.py \
    --transcripts {input.transcriptome} \
    --reference {input.reference} \
    --gtf {input.gtf} \
    -t {threads} \
    -o rnaquast/{wildcards.sample}_{wildcards.reference}
    """

如果你坚持不在路径中添加分隔符,也可以通过wildcard_constraints给两个通配符添加严格的正则匹配约束,限定每个通配符只能取你预设列表里的值,但这种方式维护成本更高,远不如添加固定分隔符简单可靠。

内容的提问来源于stack exchange,提问作者Snail Shaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:01:02