Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 提供成对文件列表作为Snakemake的输入_List_Input_Snakemake - Fatal编程技术网

List 提供成对文件列表作为Snakemake的输入

List 提供成对文件列表作为Snakemake的输入,list,input,snakemake,List,Input,Snakemake,我已经完成了一个简单的管道,在这个管道中,我获取了几个文件,将它们合并到一个文件名是这两个文件的简单组合的文件中(file1_file2.output),并执行一些操作。如果我手动提供file1和file2的文件名,管道工作得很好,但我真正要做的是这样: rule all: input: expand("output/{combination}.output", combination=["A_D","B_D","C_E"]) rule Paste: input

我已经完成了一个简单的管道,在这个管道中,我获取了几个文件,将它们合并到一个文件名是这两个文件的简单组合的文件中(file1_file2.output),并执行一些操作。如果我手动提供file1和file2的文件名,管道工作得很好,但我真正要做的是这样:

rule all:
    input:
        expand("output/{combination}.output", combination=["A_D","B_D","C_E"])

rule Paste:
    input:
        F1="{file1}",
        F2="{file2}"
    output:
        out="output/{file1}_{file2}.output"
    shell:
        "paste {input.F1} {input.F2} > {output.out}"
让我们假设我有5个文件ABCDE。我想为这些对运行管道:A-DB-DC-E,这是蛇文件

规则所有:
输入:
展开(“output/{file1}{file2}.output”)
规则粘贴:
输入:
F1=“{file1}”,
F2=“{file2}”
输出:
out=“output/{file1}{file2}.output”
外壳:
“粘贴{input.F1}{input.F2}>{output.out}”

最好的方法是什么?

您必须在规则all中定义目标文件的真实名称。然后使用通配符获取输入文件。它看起来是这样的:

rule all:
    input:
        expand("output/{combination}.output", combination=["A_D","B_D","C_E"])

rule Paste:
    input:
        F1="{file1}",
        F2="{file2}"
    output:
        out="output/{file1}_{file2}.output"
    shell:
        "paste {input.F1} {input.F2} > {output.out}"

请注意,如果您的输入文件(a、B、C、D、E)也包含“\u0”,则使用诸如“\u0”之类的糟糕分隔符可能会打乱通配符的确定。我会使用一些您确信不会在文件名中使用的内容(即:“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。是的,我想在规则中使用真实名称,但我就是不知道如何为那些{file1}和{file2}分配真实的文件名。哦,是的,我只使用了一个简单的下划线作为分隔符,只是为了使示例尽可能简单,在实际的管道中,我还有其他一些东西。@AGarofoli为什么不使用文件1和2的实际文件名?在本例中,“file1”应为“A”,而“file2”应为“D”,表示“output/A-D.output”。但是您可以设置输入,如
F1=“/full/path/to/my/data/{file1}.which”
。这将保留文件的真实名称。另一种方法是使用结构化文件。请看我的回答: