0

中間ファイルを避けるために、2 つのコマンド ラインを 1 つのコマンド ラインとして結合したいと考えています。

workdir: "/path/to/workdir/"

rule all:
    input: 
        "my.filtered.vcf.gz"

rule bedtools:
    input:
        invcf="/path/to/my.vcf.gz",
        bedgz="/path/to/my.bed.gz"
    output:
        outvcf="my.filtered.vcf.gz"
    shell:
        "/Tools/bedtools2/bin/bedtools intersect -a {input.invcf} -b {input.bedgz} -header -wa |"
        "/Tools/bcftools/bcftools annotate -c CHROM,FROM,TO,GENE -h <(echo '##INFO=<ID=GENE,Number=1,Type=String,Description="Gene name">') > {output.outvcf}"

無効な構文エラーが発生しています。snakemakeで複数のシェルラインを組み合わせる方法を説明していただければ幸いです。

4

2 に答える 2

3

"ここでシェルで使用しているため、無効な構文が得られる可能性がありますDescription="Gene name">。これでシェルが閉じます。これらの引用符をエスケープするか、次の"""構文を使用できます。

rule bedtools:
    input:
        invcf="/path/to/my.vcf.gz",
        bedgz="/path/to/my.bed.gz"
    output:
        outvcf="my.filtered.vcf.gz"
    shell:
        "/Tools/bedtools2/bin/bedtools intersect -a {input.invcf} -b {input.bedgz} -header -wa |"
        "/Tools/bcftools/bcftools annotate -c CHROM,FROM,TO,GENE -h <(echo '##INFO=<ID=GENE,Number=1,Type=String,Description=\"Gene name\">') > {output.outvcf}"

また

rule bedtools:
    input:
        invcf="/path/to/my.vcf.gz",
        bedgz="/path/to/my.bed.gz"
    output:
        outvcf="my.filtered.vcf.gz"
    shell:
        """
        /Tools/bedtools2/bin/bedtools intersect -a {input.invcf} -b {input.bedgz} -header -wa | /Tools/bcftools/bcftools annotate -c CHROM,FROM,TO,GENE -h <(echo '##INFO=<ID=GENE,Number=1,Type=String,Description="Gene name">') > {output.outvcf}
        """

で複数行を使用できることに注意してください"""。パイプなしの例:

shell:
    """
    bedtools .... {input} > tempFile 
    bcftools .... tempFile > tempFile2
    whatever .... tempFile2 > {output}
    """
于 2020-02-19T09:42:38.400 に答える
2

二重引用符をエスケープすることが問題ですが、フォーマットとパイプについてもう少し追加します。

"行の間隔を空けることができるように、各行をラップする構文を好みます。

rule bedtools:
    input:
        invcf="/path/to/my.vcf.gz",
        bedgz="/path/to/my.bed.gz"
    output:
        outvcf="my.filtered.vcf.gz"
    shell:
        "/Tools/bedtools2/bin/bedtools "
           "intersect "
           "-a {input.invcf} "
           "-b {input.bedgz} "
           "-header -wa "
        "| /Tools/bcftools/bcftools "
           "annotate "
           "-c CHROM,FROM,TO,GENE "
           "-h <(echo '##INFO=<ID=GENE,Number=1,Type=String,Description=\"Gene name\">') "
        "> {output.outvcf}"

各引数をより明確に確認でき、行を移動することで簡単に変更できることがわかりました。ただし、各行の末尾にスペースが必要であり\n、別のコマンドが必要な場合は明示的な改行を使用する必要があることに注意してください。プロンプトが出力されると、出力は適切にフォーマットされます。この"""構文では、最後に各改行をエスケープする必要があり、行頭\のスペースは印刷時に保持されます。

やるべきパイプ作業がたくさんある場合は、パイプ フラグをチェックしてください。最初のステップをルールとして記述すると、snakemake はルール間に名前付きパイプを生成し、それらをグループとして送信します。

rule bedtools_intersect:
    input:
        invcf="/path/to/my.vcf.gz",
        bedgz="/path/to/my.bed.gz"
    output:
        outvcf=pipe("my.intersected.vcf.gz")
    shell:
        "/Tools/bedtools2/bin/bedtools "
           "intersect "
           "-a {input.invcf} "
           "-b {input.bedgz} "
           "-header -wa "
        "> {output.outvcf}"

rule bcftools_annotate:
    input:
        invcf="my.intersected.vcf.gz"
    output:
        outvcf="my.filtered.vcf.gz"
    shell:
        "/Tools/bcftools/bcftools "
           "annotate "
           "-c CHROM,FROM,TO,GENE "
           "-h <(echo '##INFO=<ID=GENE,Number=1,Type=String,Description=\"Gene name\">') "
           "{input.invcf} "
        "> {output.outvcf}"

利点は、パイプライン全体で各ルールを再利用して、一時ファイルを回避しながら交差または注釈を付けることができることです。

于 2020-02-19T15:21:15.837 に答える