我完成了一个简单的管道,在该管道中,我将几个文件合并(不是真的,但我们假装它们已合并)到一个文件名是两者的简单组合(file1_file2.output)并执行一些操作的管道中。操作。如果我手动提供文件1和文件2的文件名,则管道可以完美地工作,但是我真正要做的是这样的:
假装我有5个文件 A , B , C , D 和 E < / strong>。我想为这些对运行管道: A-D , B-D 和 C-E ,这就是Snakefile
rule all:
input:
expand("output/{file1}_{file2}.output")
rule Paste:
input:
F1="{file1}",
F2="{file2}"
output:
out="output/{file1}_{file2}.output"
shell:
"paste {input.F1} {input.F2} > {output.out}"
这样做的最佳方法是什么?
答案 0 :(得分:1)
您必须在rule 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)也包含“ _”,则使用不正确的分隔符(例如“ _”)可能会打乱通配符的确定。我将使用您确定不会在文件名中使用的名称(例如:“ __”,“ _-_”或任何适当的名称)