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 stdout
und unterschiedliche Dateien. Außerdem ist stdout.fq
der Name für und iststdout
/dev/stdout
stdin
/dev/stdin
Antwort2
Es hängt davon ab, wie reformat.sh
es 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/stdin
und 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
bam
Wenn das funktioniert, können Sie mit Folgendem mehrere Dateien parallelisieren :
export -f refo
parallel refo {} {.} ::: *.bam