Bioinformatics snakemake中的未知输出

Bioinformatics snakemake中的未知输出,bioinformatics,snakemake,Bioinformatics,Snakemake,我正在snakemake中实现一个非常简单的管道,希望用一个内聚的snakemake文件替换一系列恼人的bash脚本 我在编写一个将文件分割成更小的部分(使用GNU分割)的规则时遇到了问题,然后导致第二个规则,其中输出连接在一起 我不知道在concat步骤中为输入编写什么,因为我不知道如何定义符合模式的所有文件bam\u files/test*。我试过使用glob,但这显然不起作用(似乎它实际上跳过了包含glob的split)。有没有更好的办法让我这么做 # test snakemake pip

我正在snakemake中实现一个非常简单的管道,希望用一个内聚的snakemake文件替换一系列恼人的bash脚本

我在编写一个将文件分割成更小的部分(使用GNU分割)的规则时遇到了问题,然后导致第二个规则,其中输出连接在一起

我不知道在concat步骤中为输入编写什么,因为我不知道如何定义符合模式的所有文件
bam\u files/test*
。我试过使用glob,但这显然不起作用(似乎它实际上跳过了包含glob的split)。有没有更好的办法让我这么做

# 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}"

我认为这应该奏效:

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

您研究过
dynamic()
吗?