如何在Snakemake中复用排序规则实现A>B>A流水线?
嘿,这个问题刚好是Snakemake通配符的典型应用场景,能帮你彻底简化重复代码!你完全不需要写两个逻辑相同的排序规则,用通配符就能复用同一个规则处理不同的输入输出。
具体解决方案
下面是重构后的完整流水线,只需要一个通用排序规则就能实现你想要的排序→处理→再排序流程:
1. 编写通用排序规则
把原来的rule A和C替换成一个带通配符的规则,这里我们用正则通配符来精确匹配你的文件名编号逻辑(比如sample.1.txt→sample.2.sorted.txt,sample.3.man.txt→sample.4.man.sorted.txt):
# 通用排序规则,替代原有的rule A和rule C rule sort: # 正则捕获文件名中的数字部分和可选后缀(比如.man) input: r"data/sample\.(\d+)(\..+)?\.txt" # 输出时将数字+1,保留原有后缀,再加上.sorted标记 output: r"data/sample.{int(\1)+1}\2.sorted.txt" shell: "somethingsomething sort {input} > {output}"
如果你的文件名规则不需要严格的数字递增,也可以用更灵活的通配符适配任意输入文件:
rule sort: input: "{input_file}" output: "{input_file}.sorted.txt" shell: "somethingsomething sort {input} > {output}"
2. 保留原有的处理规则B
你的rule B逻辑完全不需要改动,只需要确保它的输入输出和排序规则的产物对应:
rule manipulate: input: "data/sample.2.sorted.txt" # 对应第一次sort处理sample.1.txt的输出 output: "data/sample.3.man.txt" shell: "somethingsomething manipulate {input}"
3. 定义流水线的最终目标
Snakemake是目标驱动的工具,你需要明确指定最终要生成的文件,它会自动回溯整个依赖链:
rule all: input: "data/sample.4.man.sorted.txt" # 最终目标:处理后的文件再排序的结果
运行效果
当你执行snakemake命令时,它会自动完成以下流程:
- 第一次调用
sort规则,处理data/sample.1.txt生成data/sample.2.sorted.txt - 调用
manipulate规则,处理data/sample.2.sorted.txt生成data/sample.3.man.txt - 第二次调用
sort规则,处理data/sample.3.man.txt生成最终的data/sample.4.man.sorted.txt
核心原理
Snakemake的通配符会自动匹配文件名中的可变部分,当它识别到最终目标文件时,会反向推导依赖:从最终的排序产物,找到需要的输入(处理后的文件),再找到处理文件的输入(第一次排序的产物),最后回溯到初始的原始文件。整个过程不需要你手动指定调用顺序,完全由Snakemake自动处理。
内容的提问来源于stack exchange,提问作者AGarofoli
相关产品推荐
相关产品推荐

