同時に実行されている複数のファイルの stdout と stdin を出力する

同時に実行されている複数のファイルの stdout と stdin を出力する

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/stdoutstdin/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

関連情報