运行 一条规则有条件地输入文件

Run one rule conditionally to the input files

我刚刚开始学习 Snakemake,所以这可能是一个幼稚的问题。 我需要在管道的两个不同时刻启动一个规则,使用不同的输入并产生不同的输出。

让我举一个愚蠢的例子。假设我有 3 条规则:

rule A:
    input:
        "data/sample.1.txt"
    output:
        "data/sample.2.sorted.txt"
    shell:
        "somethingsomething sort {input}"



rule B:
    input:
        "data/sample.2.sorted.txt"
    output:
        "data/sample.3.man.txt"
    shell:
        "somethingsomething manipulate {input}"


rule C:
    input:
        "data/sample.3.man.txt"
    output:
        "data/sample.4.man.sorted.txt"
    shell:
        "somethingsomething sort {input}"

在此示例中,管道 A > B > C,A 和 C 完全相同,但一个使用文件 1 并输出 2,而另一个使用 3 并输出 4。最好的是什么只有一个排序规则的解决方案,以便管道执行 A > B > A? (可能有一些方法可以使用通配符来做到这一点,也许与 if else 结合使用,但我不确定如何)

感谢您的宝贵时间

可能有一些方法可以重新使用规则,但我怀疑它会使代码变得比必要的更复杂。

如果规则 A 和 C 的 shell 调用相同,并且您不想复制和粘贴代码,只需将代码放入变量中并重新使用该变量:

sorter= "somethingsomething sort {input}"

rule A:
    input:
        "data/sample.1.txt"
    output:
        "data/sample.2.sorted.txt"
    shell:
        sorter

rule B:
    input:
        "data/sample.2.sorted.txt"
    output:
        "data/sample.3.man.txt"
    shell:
        "somethingsomething manipulate {input}"

rule C:
    input:
        "data/sample.3.man.txt"
    output:
        "data/sample.4.man.sorted.txt"
    shell:
        sorter