Snakemake:仅扩展通配符的一个子集

Snakemake: expanding only a subset of wildcards

我找不到这个可能很简单的问题的解决方案:

我有这个 snakefile,它首先生成以下文件:

在下一步中,它只是将文件连接成一个文件 concatenated/concatenated.txt

这是最小的、可重现的例子:

pairs = {"P1" : "P1", "P2" : "P2"}

samples = {
    "sample1": "sample1",
    "sample2": "sample2"
}

rule all:
    input: "concatenated/concatenated.txt"

rule get_txt_files:
    output:
        "data/{sample}_{pair}.txt"
    shell:
        """
        echo 1 > {output}
        """

rule concatenate:
  input:
    expand("data/{sample}_{pair}.txt", sample=samples, \
        pair=pairs)
  output:
    "concatenated/concatenated.txt"
  shell:
    "cat {input} > {output};"

我的问题很简单:如何修改规则 concatenate,以便它连接具有相同样本名称的文件?

期望的输出是:

如有任何帮助,我们将不胜感激。

编辑

我有一个非常相似的后续问题,所以我认为没有必要重新开一个新问题:

如果我的预期输出如下:

明确一点:我只想创建一个新的目录并将文件移动到那个定制的目录中。

这样做似乎很直观:

pairs = {"P1" : "P1", "P2" : "P2"}

samples = {
    "sample1": "sample1",
    "sample2": "sample2"
}

rule all:
    input: expand("data/{sample}/{sample}_{pair}.txt", sample=samples, pair = pairs)

rule get_txt_files:
    output:
        "data/{sample}_{pair}.txt"
    shell:
        """
        echo 1 > {output}
        """

rule reorganise:
  input:
    expand("data/{{sample}}_{pair}.txt", \
        pair=pairs)
  output:
    "data/{sample}/{sample}_{pair}.txt"
  shell:
    "mv {input} data/{wildcards.sample}/.;"

你能找出问题所在吗?

非常感谢

rule concatenate:
  input:
    expand("data/{{sample}}_{pair}.txt", pair=pairs)
  output:
    "concatenated/{sample}.txt"
  shell:
    "cat {input} > {output};"

评论中对 q 的回答:

from snakemake.io import expand # automatically imported in Snakemake 

expand("data/{{sample}}_{pair}.txt", pair="A B C".split())
# ['data/{sample}_A.txt', 'data/{sample}_B.txt', 'data/{sample}_C.txt']