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

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

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

#!/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&

如何将这段代码更改为至少部分并行?是否值得这样做我正在尝试将整个脚本合并到另一个脚本中,您可以在不同的问题上看到该脚本这里 我是不是该?我的表现会得到相当大的提升吗?

答案1

parallel echo HaploSample.chr{1}{2}{3}.raw.vcf ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2

答案2

我没有parallel,而且我不太明白你的脚本的实质在做什么,所以我无法测试这个。但我相信这会起作用,并且可能是您正在寻找的风格。

重写脚本以删除循环并接受参数:

#!/bin/bash
#parallel call SNPs with chromosomes by GATK
            (to be safe, verify that "$#" is 3)
i="$1"
o="$2"
u="$3"
            (if you want, verify that the arguments are valid)
gatk HaplotypeCaller \
          ︙       \
    -L "chr$i$o$u" \
    -O "GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf" &
 
gatk HaplotypeCaller \
          ︙       \
    -L chrUn -O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf &
然后像这样运行它:
printf '%s\n' {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2} | parallel -L1 (your_script)
让我带您了解一下:

  • {1,2,3}展开为三个词:1、 2 和 3
  • {1,2,3} {A,B}扩展为五个单词:1、  2、 3和 A 。 B
  • {1,2,3}{A,B}扩展为六个单词: 1A、  1B、  2A、 2B和 3A 。 3B
  • {1,2,3}' '{A,B}扩展为六个单词: 1 A、  1 B、  2 A、 2 B和 3 A 。 3 B请注意,这些“单词”包括空格。
  • {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2}扩展为 42 (7×3×2) 个单词,每个单词包含两个空格。
  • printf '%s\n'在单独的行上输出每个“单词”。但请记住,我们谈论的是其中带有空格的“单词”。效果是每行打印两个或三个常规(非空白)单词。例如,
    $ printf '%s\n' {1,2,3}' '{A,B}
    1 A
    1 B
    2 A
    2 B
    3 A
    3 B
    
    此时,这些都是普通空间;它们不再被引用。
  • -L1告诉parallel您使用一行中的数据运行您的程序。它将在空格处将行分开,并获得一组三个参数。

答案3

#!/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

答案4

在第一个近似值中,当作业数量 <= 核心数量时,并行才有意义。有42核可用吗?如果不是,那么同时并行所有作业可能没有意义。

这是并行工作的“天真的”方法:

1)不要运行命令,而是编写它们:

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 个。

起泡沫,冲洗,重复。

相关内容