Snakemake:从输入中剥离路径

时间:2019-02-06 14:08:33

标签: snakemake

我想在snakemake中编写一个管道,该管道从config.yaml获取输入文件,运行命令,并将输出写入原始文件名+新后缀下的当前目录。

Snakefile

configfile: "config.yaml"
rule target:
    input:
        config["reads"]+".fasta.gz",

rule raw_convert:
    input:
        config["reads"]
    output:
        config["reads"]+".fasta.gz" # old path specified here
    shell:
        "sed -n '1~4s/^@/>/p;2~4p' {input} | gzip > {output}"

config.yaml

reads: /path/to/dir/myreads.fq.gz

使用bash,我会写一些类似的文件来获取文件myreads.fq.gz.fasta.gz

sed -n '1~4s/^@/>/p;2~4p' ${input} | gzip >$(basename ${input}).fasta.gz

2 个答案:

答案 0 :(得分:0)

在此解决方案中,我将读的基名与字典中的完整路径配对,然后在规则中使用它。如果基本名称不是唯一的,这将失败。

import os

d = {}
for read in config["reads"]:
    basename = os.path.basename(read)
    d[basename] = read

rule all:
    input:
        expand('{read_basename}.fasta.gz', read_basename=list(d.keys()))

rule xxx:
    input:
        lambda wildcards: d[wildcards.read_basename]
    output:
        "{read_basename}.fasta.gz"
    shell:
        'soemthing'

您可能希望将.fq.gz替换为.fasta.gz,而不是附加它们。出于可读性目的。

答案 1 :(得分:0)

我终于想出了一些可以解决问题的代码:

configfile: "config.yaml"
import os
basenamereads = os.path.basename(config["reads"])

rule target:
    input: expand("{myoutput}.fasta.gz", myoutput=basenamereads)

rule xxx:
    input:
        config["reads"]
    output:
        os.path.basename(config["reads"])+".fasta.gz"
    shell:
        "cat {input} >{output}"