首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >snakemake shell脚本中输入的组合

snakemake shell脚本中输入的组合
EN

Stack Overflow用户
提问于 2020-03-25 17:24:50
回答 1查看 395关注 0票数 0

我有下面的bash脚本,我想把它转换成一个snakefile:

代码语言:javascript
复制
mmseqs rbh flye_db megahit_db flye_megahit_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12
mmseqs rbh flye_db metaspades_db flye_metaspades_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12
mmseqs rbh megahit_db metaspades_db megahit_metaspades_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12

我已经想出了以下内容,但我想知道是否有一种方法可以使用regex或展开来进一步改进代码:

代码语言:javascript
复制
rule mmseq2_compare:
    input:
        mm1=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="flye"),
        mm2=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="megahit"),
        mm3=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="metaspades_hybrid")
    output: 
        mo1=os.path.join(RESULTS_DIR, "annotation/mmseq2/flye_megahit_rbh"),
        mo2=os.path.join(RESULTS_DIR, "annotation/mmseq2/flye_metaspades_hybrid_rbh"),
        mo3=os.path.join(RESULTS_DIR, "annotation/mmseq2/megahit_metaspades_hybrid_rbh")
    log: os.path.join(RESULTS_DIR, "annotation/mmseq2/compare.mmseq2.log")
    conda: "cd-hit.yml"
    shell:
        """
        (date &&\
        mmseqs rbh {input.mm1} {input.mm2} {output.mo1} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        mmseqs rbh {input.mm1} {input.mm3} {output.mo2} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        mmseqs rbh {input.mm2} {input.mm3} {output.mo3} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        date) &> >(tee {log})
        """

有了三个汇编程序(flye,megahit和metaspades_hybrid),有没有办法消除冗余,特别是在“shell”中?

谢谢!

试运行输出

代码语言:javascript
复制
Building DAG of jobs...
Job counts:
        count   jobs
        1       all
        1       mmseq_compare
        2

[Thu Mar 26 12:25:14 2020]
rule mmseq_compare:
    input: results/annotation/mmseq2/flye_db, results/annotation/mmseq2/megahit_db
    output: results/annotation/mmseq2/flye_megahit_rbh
    jobid: 1
    wildcards: assembler1=flye, assembler2=megahit

mmseqs rbh results/annotation/mmseq2/flye_db results/annotation/mmseq2/megahit_db results/annotation/mmseq2/flye_megahit_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12

[Thu Mar 26 12:25:14 2020]
localrule all:
    input: results/annotation/mmseq2/flye_megahit_rbh, results/annotation/mmseq2/flye_metaspades_hybrid_rbh, results/annotation/mmseq2/megahit_metaspades_hybrid_rbh
    jobid: 0

Job counts:
        count   jobs
        1       all
        1       mmseq_compare
        2
This was a dry-run (flag -n). The order of jobs does not reflect the order of execution.```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-25 23:59:36

首先,您在输入中不需要expand。如果希望创建具有相同模式的文件名列表,则需要这样做。

接下来,只要您已经在路径中使用Unix类型的斜杠,就可以将RESULTS_DIR添加到f-字符串中以提高可读性(但不要忘记将通配符的大括号加倍)。

最后,没有必要将脚本管道与&&:分隔开来,这正是Snakemake设计的目的。

我的重编脚本版本:

代码语言:javascript
复制
rule all:
    input:
        expand(f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}__{{assembler2}}_rbh", zip,
               assembler1=["flye", "flye", "megahit"],
               assembler2=["megahit", "megahit_metaspades_hybrid", "megahit_metaspades_hybrid"])

rule mmseq_compare:
    input:
        f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}_db",
        f"{RESULTS_DIR}/annotation/mmseq2/{{assembler2}}_db"
    output: 
        f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}__{{assembler2}}_rbh"
    conda:
        "cd-hit.yml"
    shell:
        "mmseqs rbh {input[0]} {input[1]} {output} --min-seq-id 0.9 mmseq2_tmp --threads 12"

我已经排除了date和日志记录。我的解决方案有一个限制,即比较的执行顺序没有定义:在这种情况下,您需要重新考虑日志策略。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60854079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档