我想在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
答案 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}"