如何使用 snakemake 并行化文件列表的作业(初学者问题)

How to parallelize jobs for a list of files using snakemake (beginner question)

我正在为一件非常简单的事情而苦苦挣扎。在输入我的 snakemake 管道时,我想要一个目录,列出其内容,并并行处理该目录中的每个文件。天真地我认为这样的事情应该有效:

rule all:
    input:
        "in/{test}.txt"
    output:
        "out/{test}.txt"
    shell:
        "echo {input} >> {output}"

这以错误结束

WorkflowError:
Target rules may not contain wildcards. Please specify concrete files or a rule without wildcards.

我能找到的所有资源都是从对脚本中的作业列表进行硬编码开始的,这是我想避免的事情,以保持管道的通用性。这个想法是将管道指向一个包含文件列表的目录,然后让它完成它的工作。这可能吗?看起来相当简单直观,但找不到说明这一点的示例。

我不知道你为此规则使用了什么命令,但以下工作流程应该足以满足你的目的

rule all:
    input:
        expand("out/{prefix}.txt", prefix=glob_wildcards("in/{test}.txt").test)

rule test:
    input:
        "in/{test}.txt"
    output:
        "out/{test}.txt"
    shell:
        "echo {input} >> {output}"

glob_wildcards是snakemake的一个函数,用来找出所有匹配指定模式的文件(这里是in/{test}.txt),那么.text就是得到字符串列表匹配文件名中的 {test}(例如:“in/ab.txt”中的“ab”)。

然后expand可以将字符串填充到大括号包裹的占位符变量中,然后生成输入文件名列表。

所以规则all想要一个输入文件列表对应于in文件夹中的所有txt文件,然后它会让snakemake为每个文件[=19=执行规则test ]