12

これは私のスクリプトです:

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

ここでは、ディレクトリ「source」に約 30 のサブディレクトリがあります。各サブディレクトリには特定のR1 .fastq.gz ファイルとR2 .fastq.gz ファイルがあり、それらを 1 つの R1.fastq.gz と R2.fastq.gz ファイルにマージしてから、マージしたファイルを宛先ディレクトリに保存します。私のコードは正常に動作しますが、データ量が多いため高速化する必要があります。スクリプトにマルチスレッド プログラミングを実装する方法はありますか? 複数のジョブが並行して実行されるようにスクリプトを実行するにはどうすればよいですか? bash スクリプトは初めてなので、助けていただければ幸いです。

4

2 に答える 2

9

&最も簡単な方法は、コマンドの末尾に追加して、バックグラウンドでコマンドを実行することです。

#!/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マニュアルから:

コマンドが制御演算子 '&' によって終了された場合、シェルはコマンドをサブシェルで非同期的に実行します。これは、コマンドをバックグラウンドで実行することとして知られています。シェルはコマンドの終了を待機せず、戻りステータスは 0 (true) です。ジョブ制御がアクティブでない場合 (「ジョブ制御」を参照)、明示的なリダイレクトがない場合、非同期コマンドの標準入力は /dev/null からリダイレクトされます。

于 2013-08-22T15:29:02.677 に答える