通配符
直接用例子来说明通配符如何使用。
加上我们需要使用 cat 命令将样本 a 的 fq1 文件的多个分段文件拼接在一起,即将 a.1-1.fq, a.1-2.fq, ... 拼接成 a.1.fq 文件。
最直接的,我们列举出每一个文件:
rule cat_fq:
input:
"fq/a.1-1.fq",
"fq/a.1-2.fq"
output:
"output/a.1.fq"
shell:
"cat {input} > {output}"
假设我们现在还需要处理样本 b,显然再写一个 Snakefile 有失优雅。此时只需要将上述与样本名称相关的部分改成通配符即可:
rule cat_fq:
input:
"fq/{sample}.1-1.fq",
"fq/{sample}.1-2.fq",
output:
"output/{sample}.1.fq",
shell:
"cat {input} > {output}"
这样通配符 sample 的值自动从 snakemake 命令指定的路径中获取。
现在我们只能处理某个样本的 fq1 序列,稍微修改一下就能兼容对 fq2 文文件的处理:
rule cat_fq:
input:
"fq/{sample}.{index}-1.fq",
"fq/{sample}.{index}-2.fq",
output:
"output/{sample}.{index}.fq",
shell:
"cat {input} > {output}"
这里可能存在一个问题:如果 sample 名称里面带句号,例如 sample.a.1.fq,"{sample}.{index}.fq"
就会产生歧义:
sample = "sample.a"; index = "1"
sample = "sample"; index = "a.1"
为此我们需要消除这种歧义,比如限定 index 只匹配一位数字:
rule cat_fq:
input:
"fq/{sample}.{index}-1.fq",
"fq/{sample}.{index}-2.fq",
output:
"output/{sample}.{index,\d}.fq",
shell:
"cat {input} > {output}"
除了 {index, \d}
这种形式外,还可以单独在 widlcard_constraints 字段中设置:
rule cat_fq:
input:
"fq/{sample}.{index}-1.fq",
"fq/{sample}.{index}-2.fq",
output:
"output/{sample}.{index,\d}.fq",
wildcard_constraints:
dataset="\d"
shell:
"cat {input} > {output}"
还可以全局设置:
wildcard_constraints:
dataset="\d"
rule cat_fq:
input:
"fq/{sample}.{index}-1.fq",
"fq/{sample}.{index}-2.fq",
output:
"output/{sample}.{index,\d}.fq",
shell:
"cat {input} > {output}"
输入文件如果有多个,可以使用列表推导式或者 expand 函数简化:
rule cat_fq:
input:
expand("fq/{{sample}}.{{index}}-{i}.fq", i=[1,2])
output:
"output/{sample}.{index,\d}.fq",
shell:
"cat {input} > {output}"
通配符在 input/output 字段里写成 {sample}
,在 shell 部分写成 {wildcards.sample}
。
评论区