snakemake - 在snakemake中组合shell命令行
问题描述
我想将两个命令行组合为一个,以避免中间文件。
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 中组合多个shell 行,我将不胜感激。
解决方案
"
由于您在此处的 shell 中使用了 ,您可能会得到一个无效的语法: 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}
"""
推荐阅读
- python-3.x - 如果它不属于训练数据集,我该如何设置错误消息?
- vue.js - 运行“npm run build”需要什么?
- node.js - 如何查看 nodejs 中 readline 模块的源代码?
- python - Tensorflow Callback:如何将最佳模型保存在内存而不是磁盘上
- javascript - 当没有变化和方法未找到问题时,mutationobserver 触发
- c++ - 如何使用可变参数模板 c++ 泛化此函数
- go - 'sconn, ok:= conn.(*tls.Conn)' 是什么意思?
- python - Python 产品聊天机器人
- javascript - 仪表板中的图表应在表单提交后更新
- python - 如何从标签=> 0,1,2,3 ....重命名熊猫系列结构的索引?