2013-08-22 36 views
9

這是我的腳本:如何在我的bash腳本中使用並行編程/多線程?

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz 
done 

在這裏有在目錄「來源」約30子目錄。每個子目錄都有一定的R1.fastq.gz文件和R2.fastq.gz,我想合併成一個R1.fastq.gz和R2.fastq.gz文件,然後將合併的文件保存到目的地目錄。我的代碼工作正常,但我需要加快它的數據量。我只想知道我有什麼方法可以在腳本中實現多線程編程?我如何運行我的腳本,以便多個作業並行運行?新的bash腳本,所以任何幫助將不勝感激。

+0

既然你清楚地處理生物信息學,你應該閱讀這些:http://www.biostars.org/p/81359/ http://www.biostars.org/p/63816/ –

回答

7

最簡單的方法是在後臺加入&到命令的最後執行的命令,結束使用&

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
done 

bash manual

如果命令是由控制操作員'&'終止,shell在子shell中異步執行命令。這被稱爲在後臺執行命令。 shell不會等待命令完成,並且返回狀態爲0(true)。如果作業控制未處於活動狀態(請參閱作業控制),則在沒有任何明確重定向的情況下,異步命令的標準輸入會從/ dev/null重定向。

+0

我實際上指的到其他關於這個問題的stackoverflow問題,他們提到像pid和等待和事情的東西。那麼,在命令末尾添加一個&並行工作的有效方式? –

+1

@ user2703967是的......加入'&'會產生一個新的子shell,它會在你的腳本繼續時消失並執行它。如果你需要比這更復雜的東西,你可能不應該首先使用bash。 –

+0

謝謝,最後一個問題。當我在「完成」之後使用「等待」時,它有什麼不同? –

3

我不知道,但你可以嘗試在命令中像這樣

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
相關問題