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

时间:2019-01-09 11:05:32

标签: snakemake

我刚刚开始学习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结合使用,但我不确定如何)

谢谢您的时间

1 个答案:

答案 0 :(得分:1)

也许有一些方法可以重用规则,但是我怀疑这会使代码变得更加复杂。

如果规则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