无共享通配符时如何在Snakefile中实现输入输出一一配对
Snakefile无共享通配符实现输入输出一一配对方案
你需要的A→A1、B→B2这类一一绑定、无共享通配符的需求,可通过遍历配对生成独立规则的方式实现,具体实现如下:
完整实现代码
# 定义输入、输出序列,顺序对应配对关系 inputs = ["A", "B", "C", "D"] outputs = ["1", "2", "3", "4"] # 存储所有最终生成的目标文件,供默认规则调用 target_list = [] for input_item, output_item in zip(inputs, outputs): # 自定义生成的目标文件名,当前按照你要求的A1/B2格式拼接 target_file = f"{input_item}{output_item}" target_list.append(target_file) # 为每一组配对单独生成规则,完全不涉及共享通配符 rule: name: f"process_{target_file}" # 你的原始输入文件,如果有后缀可调整为 f"{input_item}.txt" 这类格式 input: input_item output: target_file shell: """ # 此处替换为你实际的处理命令,示例为将输入内容写入输出文件 cat {input} > {output} """ # 默认规则,执行后会生成所有配对的目标文件 rule all: input: target_list
注意事项
- 每个配对对应独立的规则,规则名唯一,不会出现跨配对的匹配冲突
- 输入、输出的文件名格式可按需调整,只需修改
input和target_file的拼接规则即可 - 处理命令统一修改
shell块内的内容即可,所有配对会复用相同的处理逻辑
可选补充:如果你后续允许使用通配符,可通过绑定映射表的方式简化代码,同时保证不会出现配对错误,该写法不符合你无共享通配符的要求可直接忽略:
inputs = ["A", "B", "C", "D"] outputs = ["1", "2", "3", "4"] # 生成一一对应的映射表 pair_map = dict(zip(inputs, outputs)) rule all: input: expand("{inp}{out}", inp=inputs, out=lambda wildcards: pair_map[wildcards.inp]) rule process_pair: output: "{inp}{out}" input: "{inp}" shell: "cat {input} > {output}"
内容的提问来源于stack exchange,提问作者ninthpower
相关产品推荐
相关产品推荐

