snakemake - 使用snakemake将文件复制到多个目录,其中通配符用于目标名称的一部分
问题描述
我正在尝试使用 snakemake 将文件复制到多个目录,并且我需要能够使用通配符作为目标名称的一部分。以前我尝试过在 Snakefile 中指定“dirs”(这是一个示例,实际应用程序有 15 个目录)。
dirs=['k_1','k2_10']
rule all:
input:
expand("{f}/practice_phased_reversed.vcf",f=dirs)
rule r1:
input:
"practice_phased_reversed.vcf"
output:
"{f}/{input}"
shell:
"cp {input} {output}"
这会根据需要复制文件。但是文件名必须在规则 all 中给出。如何更改此设置,以便可以在命令行上使用通配符作为名称的一部分指定目标?
然后我尝试了这个(如下),使用命令“snakemake practice_phased_reversed.vcf”,但它给出了一个错误:“MissingRuleException:没有规则产生 practice_phased_reversed.vcf”
dirs=['k_1','k2_10']
rule all:
input:
expand("{f}/{{base}}_phased_reversed.vcf",f=dirs)
rule r1:
input:
"{base}_phased_reversed.vcf"
output:
"{f}/{input}"
shell:
"cp {input} {output}"
有没有办法解决这个问题,所以我可以使用命令行和通配符。谢谢你的帮助。
解决方案
我建议进行一些更改。您的第二个蛇文件将无法全部解析规则,因为它仍然包含通配符base
。您需要在配置文件中或通过命令行提供。
但是,如果你只是想通过命令行来表达目标,你不需要担心所有的规则。在规则 r1 中,您可能想要扩展输出;我认为引用不起作用input
,我很惊讶这不是一个错误......
所以:
rule r1:
input:
"{base}_phased_reversed.vcf"
output:
"{f}/{base}_phased_reversed.vcf"
shell:
"cp {input} {output}"
snakemake ./test_phased_reversed.vcf
仍然会是一个错误,因为它试图将一个文件作为同一规则的输入和输出。我同意这个错误信息不是很丰富,因为输入文件确实存在。也许在引擎盖下,由于匹配的输入/输出,snakemake 将规则 r1 排除在考虑之外? snakemake test/test_phased_reversed.vcf
在子目录中给出一个副本。
希望这很清楚。我不太明白你想要完成的事情!
推荐阅读
- python - 如何通过 .apply() 在 Lambda 函数上使用 2 个参数
- gnuplot - 标签未显示在 Gnuplot 2D 热图上
- jenkins - 如何在rtc插件Jenkins中传递参数
- javascript - RegExp 特殊字符转义
- c++ - 在 C++ 中的链表末尾插入一个节点
- kdb - 基于行信息的条件更新字段
- database-design - 数据库设计示例,是否正确?
- java - 在 Javafx 中触发事件后获取值
- laravel - Laravel - 使用自定义列名进行验证
- javascript - 反应 + 节点/快递 | 在 React 中渲染 PDF 二进制流 blob