微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GNU 并行环境变量与输入分离

如何解决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 举报,一经查实,本站将立刻删除。