Scripting

將另一個腳本呼叫的腳本上的 for 循環轉換為 GNU 並行命令

  • July 12, 2019

目前,我有以下腳本用於在我創建的可重複環境中的 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&

如何將這段程式碼更改為至少部分並行?是否值得做我試圖將整個腳本合併到一個不同的腳本中,你可以在這裡看到一個不同的問題 ?我會在性能上獲得相當大的提升嗎?

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

我沒有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你用一行的數據執行你的程序。它將在空格處分行,並獲得一組三個參數。

引用自:https://unix.stackexchange.com/questions/529702