使用 IF 语句将 snakemake 中的输入文件名部分匹配到 运行 不同的 shell 命令

Using IF statement for PARTIAL match of input filename in snakemake to run different shell commands

我有 120 个在不同位置测序的 fastq 文件,我需要 trim 将每个文件中的 reads 缩小到特定长度。每个文件中读取所需的最终长度不同,这取决于它的测序位置。

在 snakemake 中,我正在尝试编写一个 IF 语句,该语句将 运行 3 个备用 shell 命令,具体取决于 fastq 文件排序位置。为此,我尝试获取 {sample} 通配符的部分字符串匹配。 运行s 下面的 Snakefile 但总是解析为 else。如果我使用整个输入字符串,它会正确解析。我不确定如何编写 IF 语句来获得我需要的部分匹配。

解释了如何解决完整的输入名称匹配,而不是部分子字符串匹配。

SAMPLES = ["1111_Crdf", "2222_Extr", "3333_Edin"]

rule all:
    input:
    expand("hard_trimmed/{sample}_R2.fastq", sample = SAMPLES)

rule hard_trim_fastq:
    input:   r1 = "qc_trimmed/{sample}_R1.fastq",
             r2 = "qc_trimmed/{sample}_R2.fastq"
    output:  "hard_trimmed/{sample}_R2.fastq"
    params: crdf = 55, extr = 80, edin = 105
    run:
        if "Crdf" in wildcards.sample:
            shell("echo {input} {output} {params.crdf}")
        elif "Extr" in wildcards.sample:
            shell("echo {input} {output} {params.extr}")
        else:
            shell("echo {input} {output} {params.extr}")

任何 advice/comments 将不胜感激。

请检查最后两个shell(...)表达式,它们完全相同:

           shell("echo {input} {output} {params.extr}")

如果您解决了该问题,即缩进问题,并且如果您提供了生成输出的规则,您的管道应该可以正常工作。这是我修改后的片段,按预期工作:

SAMPLES = ["1111_Crdf", "2222_Extr", "3333_Edin"]

rule all:
    input:
        expand("hard_trimmed/{sample}_R2.fastq", sample = SAMPLES)

rule hard_trim_fastq:
    input:
        r1 = "qc_trimmed/{sample}_R1.fastq",
        r2 = "qc_trimmed/{sample}_R2.fastq"
    output:  "hard_trimmed/{sample}_R2.fastq"
    params:
        crdf = 55,
        extr = 80,
        edin = 105
    run:
        if "Crdf" in wildcards.sample:
            shell("echo {input} {params.crdf} > {output}")
        elif "Extr" in wildcards.sample:
            shell("echo {input} {params.extr} > {output}")
        else:
            shell("echo {input} {params.edin} > {output}")