bamファイルに動作する次のコマンドがあります
reformat.sh in=test.bam out=stdout.fq primaryonly | reformat.sh in=stdin.fq out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
ここでのアイデアは、最初のコマンド(reformat.sh)の出力をファイルに書き込まないようにすることで、全体の速度を向上させることです。
現在の作業ディレクトリに複数のbamファイルがあり、クラスタで並列に実行したいと思います。複数のbamファイルを同時に処理するときにstdout.fq/stdin.fqが互いに干渉しないように、上記のコマンドでstdout.fqとstdin.fqをどのように使用できますか?
ありがとう
答え1
ファイル拡張子について非常に混乱しています。そのようなことはありません。 MS-DOSとCPM以降はありません。 MicrosoftのWindowsはまだそれを使用してファイルエクスプローラでタスクを実行しますが、ファイル名の一部にすぎません。
Sostdout
とはstdout.fq
異なるファイルです。名前はstdout
また/dev/stdout
ありstdin
、です/dev/stdin
答え2
reformat.sh
どのように使うかによって異なります。
通常、UNIXコマンドは入力/出力を提供しない限りstdinとstdoutを使用します。
reformat.sh in=test.bam primaryonly |
reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
それ以外の場合は、ファイル名として次を許可します。
reformat.sh in=test.bam out=- primaryonly |
reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
/dev/stdin
最新のBashでは、次のものを使用できます/dev/stdout
。
reformat.sh in=test.bam out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
ジョブを並列に実行するときに名前の競合を避けるために、名前をパラメーターとして使用する関数を作成します。
refo() {
in="$1"
out1="$2"1.fq.gz
out2="$2"2.fq.gz
reformat.sh in=/dev/stdin out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1="$out1" out2="$out2" interleaved addcolon
}
次のように呼び出します。
refo test.bam out
機能すると、以下をbam
使用して複数のファイルを並列に処理できます。
export -f refo
parallel refo {} {.} ::: *.bam