假设我有一个像这样的snakemake规则:
rule test:
input: myfile="myfile.txt",
params: test_out = "test",
shell: "tool {input.myfile} -p ~/desktop/{params.test_out}
该工具不支持 -o 选项来指定输出,但提供 -p 来指定文件的前缀。
基本上,该工具接受一些输入,处理文件并生成多个输出文件。但是,如果我的脚本顶部有一条规则,则它不会执行该规则,因为它不包含输出指令。我如何仍然生成此规则的输出以及规则 all 中指定的其他规则的输出?
感谢您的帮助!
你仍然有一个输出,如果你知道它,你应该告诉snakemake。举个例子,假设您知道
output.txt
将成为输出:
rule test:
input: myfile="myfile.txt",
output: "test/output.txt"
params: test_out = lambda wildcards, output: Path(output[0].parent),
shell: "tool {input.myfile} -p {params.test_out}
您知道输出文件,只需将其转换为预期的参数即可。这里需要考虑的一些因素是,如果该工具始终输出到
output.txt
,无论输入如何,您都必须为每个样本拥有唯一的子目录,以防止损坏。
该工具也可能会生成不确定数量的文件,例如
output_{1..n}.txt
但是你可以指定目录。那你就有了
rule test:
input: myfile="myfile.txt",
output: directory("test")
shell: "mkdir -p {output} ; tool {input.myfile} -p {output}
使用
directory
输出,snakemake 不再自动创建父目录,因此您必须手动执行此操作。任何使用工具输出的规则也可能需要规则为 checkpoint
,以便在执行之前可以查询输出。