Scripting
將另一個腳本呼叫的腳本上的 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&
如何將這段程式碼更改為至少部分並行?是否值得做我試圖將整個腳本合併到一個不同的腳本中,你可以在這裡看到一個不同的問題嗎 ?我會在性能上獲得相當大的提升嗎?
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
你用一行的數據執行你的程序。它將在空格處分行,並獲得一組三個參數。