在您的示例中,您实际上使用cat shell 命令将单个输入文件复制 到输出文件中。这可以理解为将多个输入连接到一个输出的意图:
rule concatenate:
input:
"input1.txt",
"input2.txt"
output:
"output.txt"
shell:
"cat {input} > {output}"
获取给定的输入文本文件并将其内容连接到给定的输出文件
另一种理解问题的方法是您尝试将输入文件附加到输出的末尾。这更具挑战性:Snakemake 根据目标“思考”,其中每个目标都是一个不同的文件。 Snakemake 如何知道输出文件是原始文件还是串联版本?做到这一点的一种方法是拥有“标志”文件:此类文件的存在意味着目标已经实现并且不需要连接。还有一个问题:Snakemake 在运行规则之前会清除输出文件。比意味着您需要将其指定为输入:
rule append:
input:
in = "input.txt",
out = "output.txt"
output:
flag = "flag"
shell:
"cat {input.in} >> {input.out} && touch {output.flag}"
现在回到您关于错误和在运行时指定文件名的方式的问题。您会收到此错误,因为通配符应该完全从 output 部分推断出来,并且您的两个规则都是格式错误的。让我们从rule all开始。
你需要说 Snakemake 你正在建立什么目标。 input 中没有通配符,所有内容都应该消除歧义:
def getInput():
pass
# form the actual goal (you may query the database, service, hardcode, etc.)
rule all:
input: getInput
假设您决定目标应该是 3 个文件:["output1.txt", "output3.txt", "output3.txt"]:
def getInput():
magic_numbers_from_oracle = ["1", "2", "3"]
return magic_numbers_from_oracle
rule all:
input: expand("output{number}.txt", number=getInput())
好的,现在 Snakemake 知道目标了。下一步是编写一个规则,说明如何创建单个output{number}.txt 文件。为简单起见,我将采用 cat/copying 的初始方法:
rule cat_copy:
input:
"input{n}.txt"
output:
"output{n}.txt"
shell:
"cat {input} > {output}"
就是这样。只要你有文件input1.txt、input2.txt、input3.txt,你就会得到相应的输出。