
Ich arbeite an einem Forschungsprojekt für Studenten, das viel mit Bioinformatik zu tun hat, und gehe eine Pipeline zur Dateiverarbeitung durch. Hintergrund: Ich arbeite mit Shotgun-Metagenomdaten, also sehr großen Ansammlungen von A, T, G, C (Nukleotiden in einer DNA-Probe) und, soweit ich weiß, einigen Qualifizierern. Ich habe bereits einige Schritte der Pipeline durchlaufen, bei denen die Dateien etwas gekürzt und bereinigt und einige Qualifizierer hinzugefügt wurden. Wichtig ist, dass diese Lesevorgänge meist gepaarte Endlesevorgänge sind, also zwei Dateien, die die Nukleotide von rechts nach links und von links nach rechts lesen.
Davor hatte ich meinen Kopf im Grunde nur mit Biologie und Ökologie vollgestopft, sodass ich keinen wirklichen Kontext zum Codieren habe oder weiß, wie/warum man Dinge macht oder allgemeine Vorgehensweisen/Funktionen usw. Sie verstehen, was ich meine.
Allerdings habe ich mir selbst grundlegende For-Schleifen und String-Manipulationen in UNIX beigebracht, indem ich einige Bash-Dateien erstellt habe, die mithilfe verschiedener Module und Funktionen durch verschiedene Ordner liefen. Hier ist ein Beispielcode:
cd ~/ncbi/public/sra/indian
for forward_read_file in *_1.fastq
do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3
rm ${forward_read_file} ${reverse_read_file}
done
#CAMEROON
cd ~/ncbi/public/sra/cameroon
for forward_read_file in *_1.fastq
do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3
rm ${forward_read_file} ${reverse_read_file}
done
und so weiter für viele Ordner. Ich habe String-Manipulation verwendet, um jede Iteration der For-Schleife dazu zu bringen, die gepaarten Enddateien aufzurufen, und dann einige Argumente und Parameter für das von mir verwendete Modul.
Das große Problem, auf das ich jetzt stoße, ist, dass mir keine Möglichkeit einfällt, die gepaarten Enddateien für meinen nächsten Schritt in der Pipeline zu paaren, da sie direkt vor der Erweiterung vier zufällige Zeichen haben und ich sie nicht vorhersagen kann. Sie enthalten keine sinnvollen Daten, daher ist mein Plan, sie aus den Dateinamen zu löschen und so weiterzumachen wie bisher.
Hier sind Beispiele für die Problemdateien. Das Problem sind die vier Zeichen am Ende der Zeichenfolge. Wenn ich diese loswerde, kann ich die Zeichenfolge wie gewohnt bearbeiten.
SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898928_2_prinseq_good_VygO.fastq SRR5898979_1_prinseq_good_CRzI.fastq SRR6166642_2_prinseq_good_nqVP.fastq SRR6166693_2_prinseq_good_y_OD.fastq
SRR5898908_2_prinseq_good_HPTU.fastq SRR5898929_1_prinseq_good_p2mS.fastq SRR5898979_2_prinseq_good_vYcE.fastq SRR6166643_1_prinseq_good_fc8y.fastq SRR6166694_1_prinseq_good_Ka1C.fastq
SRR5898909_1_prinseq_good_X41r.fastq SRR5898929_2_prinseq_good_uO8g.fastq SRR5898980_1_prinseq_good_WuPS.fastq SRR6166643_2_prinseq_good_QUUK.fastq SRR6166694_2_prinseq_good_ZlNk.fastq
SRR5898909_2_prinseq_good_GbmA.fastq SRR5898930_1_prinseq_good_3qyA.fastq
Wobei der Anfang SRRxxxxx das Sample ist und der1oder2sind Vorwärts- bzw. Rückwärts-Lesevorgänge, daher meine String-Manipulation. Das Problem sind die vier Zeichen am Ende des Strings. Wenn ich diese lösche, kann ich die String-Manipulation wie gewohnt durchführen. Mein Mentor empfahl mir, irgendwie die FIND- oder CUT-Funktionen zu verwenden, und sprach darüber, die Rückgabe des Finds als zu manipulierende Variable zu verwenden, aber ich habe das Gefühl, dass das immer noch auf dasselbe Problem stoßen würde.
Wie kann ich diese Zeichen mithilfe einer For-Schleife sicher entfernen? Oder was auch immer Ihrer Meinung nach am besten funktioniert.
Danke schön!
Antwort1
Versuchen Sie etwas wie Folgendes:
for forward_read_file in *_1*.fastq; do
srr=$(echo "$forward_read_file" | cut -d_ -f1)
rrf_array=( $(find . -name "${srr}_2_*.fastq") )
case "${#rrf_array[@]}" in
0) echo "Warning: No reverse read file found for $forward_read_file" > /dev/stderr ;;
1) reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
;;
*) echo "Error: multiple reverse read files found for $forward_read_file" > /dev/stderr ;;
esac
done
Dies durchläuft alle _1
Dateien. Es cut
extrahiert die SRR-Beispiel-ID und verwendet diese dann mit dem find
Befehl, um alle übereinstimmenden _2
Dateien zu finden. find
Die Ausgabe von wird in einem Array gespeichert, da wir nicht wissen, wie viele Ergebnisse zurückgegeben werden könnten.
Es verarbeitet drei mögliche Ergebnisse: keine Übereinstimmungen (nicht gut), genau 1 Übereinstimmung (gut, das ist, was wir wollen) und mehr als 1 Übereinstimmung (wiederum nicht gut).
Wenn nur ein Ergebnis vorhanden ist, extrahieren Sie die passende Datei aus dem Array und verarbeiten Sie sie mit Ihrem Perl-Skript.
Wenn es kein oder mehr als ein Ergebnis gibt, drucken Sie eine Warnmeldung auf stderr und fahren Sie mit dem nächsten _1
Dateinamen fort. Sie können in diesen Fällen ; exit 1
(oder anderen Code zur Behandlung des Fehlers) vor dem hinzufügen ;;
, wenn Sie möchten.
Dabei werden alle Teile des Dateinamens ignoriert, mit Ausnahme der SRR-Beispiel-ID am Anfang und des „ _1
oder“ _2
, das die Datei als Vorwärts- oder Rückwärtspaarungsdatei kennzeichnet.
if; then; else
Übrigens hätte dies auch mit einem statt einer Anweisung erfolgen können case
, aber ich dachte, es wäre sinnvoll, Null- und Mehr-als-ein-Fälle unterschiedlich zu behandeln. zB
if [ "${#rrf_array[@]}" == 1 ];
reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
else
echo "Warning: unknown problem with reverse read file for $forward_read_file" > /dev/stderr
fi
Wenn Sie die „Problemdateien“ einfach ignorieren möchten, löschen Sie den else
Block.
Um Ihr Skript lesbarer zu machen, schlage ich übrigens vor, dass Sie oben in Ihrem Skript so etwas machen:
AFilter='/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl'
und später:
perl "$AFilter" -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
Alternativ können Sie , wenn die Perl-Skripte ausführbar sind (d. h. mit einer #!/usr/bin/perl
oder einer ähnlichen Shebang-Zeile und mit dem mit gesetzten Ausführbarkeitsflag ), einfach Folgendes zu Ihrem $PATH hinzufügen:chmod +x
/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/
PATH="$PATH:/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming"
und führen Sie das Skript wie folgt aus:
AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
Antwort2
Meinen Sie die Umbenennung vom Titel aus?
So was:
cat a2 | sed -e 's|\(.*\)\(good_\)\(.*\)\(.fastq\)|mv \1\2\3\4 \1\2\4|'
mv SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898908_1_prinseq_good_.fastq
mv SRR5898928_2_prinseq_good_VygO.fastq SRR5898928_2_prinseq_good_.fastq