Ausgabe von stdout und stdin für mehrere gleichzeitig ausgeführte Dateien

Ausgabe von stdout und stdin für mehrere gleichzeitig ausgeführte Dateien

Ich habe den folgenden Befehl, der mit einer BAM-Datei funktioniert

reformat.sh in=test.bam out=stdout.fq primaryonly | reformat.sh in=stdin.fq out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon

Die Idee besteht darin, das Schreiben der Ausgabe des ersten Befehls (reformat.sh) in eine Datei zu vermeiden, was die Gesamtgeschwindigkeit erhöht.

Ich habe mehrere BAM-Dateien in meinem aktuellen Arbeitsverzeichnis und möchte sie parallel im Cluster ausführen. Wie kann ich stdout.fq und stdin.fq im obigen Befehl verwenden, sodass sich stdout.fq/stdin.fq nicht gegenseitig stören, wenn mehrere BAM-Dateien gleichzeitig verarbeitet werden?

Danke

Antwort1

Sie sind ganz verwirrt wegen der Dateinamenerweiterungen. So etwas gibt es nicht. Nicht seit MS-DOS und CPM. Microsoft Windows verwendet sie immer noch, um Aktionen im Datei-Explorer auszulösen, aber sie sind nur Teil des Dateinamens.

Daher sind stdoutund unterschiedliche Dateien. Außerdem ist stdout.fqder Name für und iststdout/dev/stdoutstdin/dev/stdin

Antwort2

Es hängt davon ab, wie reformat.shes geschrieben wird.

Häufig verwenden UNIX-Befehle stdin und stdout, wenn Sie ihnen keine Ein-/Ausgabe geben:

reformat.sh in=test.bam primaryonly |
  reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon

In anderen Fällen wird als Dateiname Folgendes akzeptiert: -

reformat.sh in=test.bam out=- primaryonly |
  reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon

In der modernen Bash können Sie /dev/stdinund verwenden /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

Um Namenskonflikte beim parallelen Ausführen von Jobs zu vermeiden, würde ich eine Funktion erstellen, die die Namen als Argumente verwendet:

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
}

Und sie nennen es so:

refo test.bam out

bamWenn das funktioniert, können Sie mit Folgendem mehrere Dateien parallelisieren :

export -f refo
parallel refo {} {.} ::: *.bam

verwandte Informationen