我正在努力在snakemake中实现一个非常简单的管道,以期用一个内聚的Snakefile替换一连串烦人的bash脚本。
我在编写将文件分割成较小的规则(使用GNU split),然后导致输出连接在一起的第二条规则时遇到了麻烦。
我不知道在concat步骤中为输入内容写什么,因为我不知道如何定义所有符合模式bam_files/test*
的文件。我尝试使用glob,但是绝对不能正常工作(似乎实际上是在跳过包含glob的拆分)。有什么更好的办法可以做到这一点吗?
# test snakemake pipeline
import glob
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
expand("{FASTQ}.txt", FASTQ=SAMPLE_IDS)
output:
"bam_files/{FASTQ}."
shell:
"cat {input} | split -l 1000 -d - {output}."
rule concat:
input:
split_files = glob.glob("bam_files/{FASTQ}.*")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
答案 0 :(得分:2)
我认为这应该可行:
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
"{FASTQ}.txt"
output:
dynamic("bam_files/{FASTQ}.{PART}")
params:
length=1000
shell:
"cat {input} | split -l {params.length} -d - bam_files/{FASTQ}."
rule concat:
input:
split_files = dynamic("bam_files/{FASTQ}.{PART}")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
看来split
规则应该一次获取一个文件{FASTQ}.txt
并产生{FASTQ}.1, {FASTQ}.2, ...
或类似内容。因为您不提前知道它将产生多少个文件,所以您需要对dynamic()
和split.output
使用concat.input
。