List 提供成对文件列表作为Snakemake的输入
我已经完成了一个简单的管道,在这个管道中,我获取了几个文件,将它们合并到一个文件名是这两个文件的简单组合的文件中(file1_file2.output),并执行一些操作。如果我手动提供file1和file2的文件名,管道工作得很好,但我真正要做的是这样: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
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个文件A,B,C,D和E。我想为这些对运行管道:A-D、B-D和C-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”
。这将保留文件的真实名称。另一种方法是使用结构化文件。请看我的回答: