Snakemake:仅扩展通配符的一个子集
Snakemake: expanding only a subset of wildcards
我找不到这个可能很简单的问题的解决方案:
我有这个 snakefile,它首先生成以下文件:
data/sample1_P1.txt
data/sample1_P2.txt
data/sample2_P1.txt
data/sample2_P2.txt
在下一步中,它只是将文件连接成一个文件 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
,以便它连接具有相同样本名称的文件?
期望的输出是:
concatenated/sample1.txt
concatenated/sample2.txt
如有任何帮助,我们将不胜感激。
编辑
我有一个非常相似的后续问题,所以我认为没有必要重新开一个新问题:
如果我的预期输出如下:
data/sample1/sample1_P1
data/sample1/sample1_P2
data/sample2/sample2_P1
data/sample2/sample2_P2
明确一点:我只想创建一个新的目录并将文件移动到那个定制的目录中。
这样做似乎很直观:
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']
我找不到这个可能很简单的问题的解决方案:
我有这个 snakefile,它首先生成以下文件:
data/sample1_P1.txt
data/sample1_P2.txt
data/sample2_P1.txt
data/sample2_P2.txt
在下一步中,它只是将文件连接成一个文件 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
,以便它连接具有相同样本名称的文件?
期望的输出是:
concatenated/sample1.txt
concatenated/sample2.txt
如有任何帮助,我们将不胜感激。
编辑
我有一个非常相似的后续问题,所以我认为没有必要重新开一个新问题:
如果我的预期输出如下:
data/sample1/sample1_P1
data/sample1/sample1_P2
data/sample2/sample2_P1
data/sample2/sample2_P2
明确一点:我只想创建一个新的目录并将文件移动到那个定制的目录中。
这样做似乎很直观:
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']