Проблема заключается в том, чтобы избежать двойных кавычек, но нужно добавить немного больше о форматировании и каналах.
Я предпочитаю синтаксис, заключающийся в заключении каждой строки в "
, чтобы можно было лучше разнести строки:
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}"
Преимущество состоит в том, что вы можете повторно использовать каждое правило по всему конвейеру для пересечения или аннотирования, избегая при этом временных файлов.
person
Troy Comi
schedule
19.02.2020