首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将另一个脚本调用的脚本上的循环转换为GNU并行命令

将另一个脚本调用的脚本上的循环转换为GNU并行命令
EN

Unix & Linux用户
提问于 2019-07-11 22:57:33
回答 3查看 200关注 0票数 1

目前,我有以下脚本在我创建的可重复环境中使用Unix系统上的HaploTypeCaller程序:

代码语言:javascript
运行
复制
#!/bin/bash
#parallel call SNPs with chromosomes by GATK
for i in 1 2 3 4 5 6 7
do
  for o in A B D
  do
    for u in _part1 _part2
    do 
      (gatk HaplotypeCaller \
        -R /storage/ppl/wentao/GATK_R_index/genome.fa \
        -I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
        -L chr$i$o$u \
        -O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &)
    done
  done
done

gatk HaplotypeCaller \
    -R /storage/ppl/wentao/GATK_R_index/genome.fa \
    -I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
    -L chrUn \
    -O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf&

如何将这段代码更改为至少部分并行?值得吗?我试图将整个脚本合并到不同的脚本中,您可以在不同的问题上看到这个脚本,这里应该这样做吗?我的表现会有很大的提高吗?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2019-07-12 05:18:03

代码语言:javascript
运行
复制
parallel echo HaploSample.chr{1}{2}{3}.raw.vcf ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2
票数 1
EN

Unix & Linux用户

发布于 2019-07-12 10:12:34

代码语言:javascript
运行
复制
#!/bin/bash
#parallel call SNPs with chromosomes by GATK

gatk_a_single() {
    i="$1"
    o="$2"
    u="$3"

    gatk HaplotypeCaller \
        -R /storage/ppl/wentao/GATK_R_index/genome.fa \
        -I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
        -L chr$i$o$u \
        -O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf
}
export -f gatk_a_single

# This call does not fit the pattern of the others, so just run that in the background
gatk_a_single Un "" "" &    

# Use 3 input sources: All combinations between all input sources will be generated and run
parallel gatk_a_single ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2

# The parallel tasks are now complete
# Wait for the earlier backgrounded task to complete
wait
票数 1
EN

Unix & Linux用户

发布于 2019-07-11 23:44:06

在第一种近似下,当作业数为<=核数时,并行是有意义的。你有42个核心可用吗?如果没有,那么将所有的工作同时并举可能是没有意义的。

以下是平行工作的“天真”方式:

1)不要运行命令,编写命令:

代码语言:javascript
运行
复制
for i in 1 2 3 4 5 6 7
do
  for o in A B D
  do
    for u in _part1 _part2
    do 
      echo "gatk HaplotypeCaller \
        -R /storage/ppl/wentao/GATK_R_index/genome.fa \
        -I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
        -L chr$i$o$u \
        -O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &"
    done
  done > file-$i.sh
done

现在,您有7个文本文件,每个文本文件包含6个命令。通过一个接一个地运行这7个脚本,您可以在6的批处理中并行作业。如果你有足够的核心(16?),你可以一次运行两批6。

泡沫,冲洗,重复。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/529702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档