二重引用符をエスケープすることが問題ですが、フォーマットとパイプについてもう少し追加します。
"
行の間隔を空けることができるように、各行をラップする構文を好みます。
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}"
利点は、パイプライン全体で各ルールを再利用して、一時ファイルを回避しながら交差または注釈を付けることができることです。