同時に実行される複数のファイルの 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はまだそれを使用してファイルエクスプローラでタスクを実行しますが、ファイル名の一部にすぎません。

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

関連情報