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 では、ファイル エクスプローラーでアクションをトリガーするためにまだ拡張子を使用していますが、拡張子はファイル名の一部にすぎません。
したがってstdout
、 と は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