转义双引号是问题所在,但要在格式和管道上添加更多内容。
我更喜欢包装每一行的语法,"
以便可以更好地间隔行:
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}"
优点是您可以在整个管道中重复使用每个规则来交叉或注释,同时避免临时文件。