You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无共享通配符时如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:03