如何解决GNU 并行环境变量与输入分离
我有一个我认为应该很容易解决的问题,但由于某种原因我无法解决它.. 我在 Snakemake 内部使用 GNU parallel 来执行一些变体调用。
我的输入文件 (contigs.txt
) 看起来像这样:
GL000207.1
GL000226.1
GL000229.1
GL000231.1
GL000210.1
GL000239.1
GL000235.1
最终执行的命令如下所示:
"name=$(bash get_name.sh normal_recal.bam) \n"
"cat {input.contigs} | "
"env_parallel --env name --jobs {threads} "
"'({input.GATK} Mutect2 -I {input.tumor} -I {input.normal} "
"-R {input.reference} -normal $name "
"--native-pair-hmm-threads 4 "
"-L {{}} --germline-resource {input.gnomAD} "
"-O {input.path}/{wildcards.sample_id}/{{}}.somatic.vcf "
"--f1r2-tar-gz {input.path}/{wildcards.sample_id}/{{}}.f1r2.tar.gz) &> {log.err}.{{}}.err' \n"
如果我在交互式终端中执行此脚本,一切都会按预期进行。但是,当我尝试在 snakemake 中执行它时,程序会结束而没有错误。我想我已经使用这个简单的例子找到了问题所在:
cat contigs | env_parallel --env name --jobs 4 'echo $name'
这会打印如下内容:
sample_tumor GL000207.1
sample_tumor GL000226.1
sample_tumor GL000229.1
sample_tumor GL000231.1
我认为问题在于,输入变量也被传递给了 $name
变量,这会导致程序崩溃。
我想知道如何实现,只有实际的 $name
(即这里 sample_tumor
)被传递。所以上面例子的输出是
sample_tumor
sample_tumor
sample_tumor
sample_tumor
干杯!
解决方法
事实证明我对错误的猜测是错误的。我想我想念使用过的 env_parallel
。
这段代码解决了我的问题。
"name=$(bash get_name.sh normal_recal.bam) \n"
"export name \n"
"cat {input.contigs} | "
"parallel --jobs {threads} "
"'({input.GATK} Mutect2 -I {input.tumor} -I {input.normal} "
"-R {input.reference} -normal $name "
"--native-pair-hmm-threads 4 "
"-L {{}} --germline-resource {input.gnomAD} "
"-O {input.path}/{wildcards.sample_id}/{{}}.somatic.vcf "
"--f1r2-tar-gz {input.path}/{wildcards.sample_id}/{{}}.f1r2.tar.gz) &> {log.err}.{{}}.err'"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。