Ich habe eine Fasta-Datei und möchte die Sequenz-IDs (Beschreibungszeilen) durch neue und erweiterte IDs ersetzen. Dies ist das Format der Fasta-Datei:
>3C-assembly|contig_74
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_75
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_76
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
...................
und möchte ein neues Fasta mit folgendem Format erreichen:
>Scaffold_001 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_002 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_003 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
....................
Das bedeutet, dass beispielsweise 3C-assembly|contig_74 durch Scaffold_001 [Sex=Female] [Unplaced scaffold] ersetzt werden sollte. Zu diesem Zweck habe ich eine Textdatei mit zwei Spalten (Tabulator-getrennt) erstellt, die diese beiden IDS verbinden:
3C-assembly|contig_74 Scaffold_001 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_75 Scaffold_002 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_76 Scaffold_003 [Sex=Female] [Unplaced scaffold]
......................
Haben Sie eine Idee, wie ich diese Textdatei verwenden kann, um IDs in meiner Fasta-Datei zu ersetzen? Vielen Dank
Antwort1
Verwendung von awk
:
awk -F'\t' '
NR==FNR{ a[$1]=$2; next }
/^>/{
id=a[substr($0, 2)]
if (id!=""){ print ">" id; next }
}
1
' textfile file.fasta
Lesen Sie zunächst die Textdatei mit der Zuordnung und speichern Sie das zweite Feld im Array, a
wobei Sie das erste Feld als Index verwenden. Springen Sie zum next
Datensatz.
Lesen Sie dann die Fasta-Datei. Wenn der Datensatz mit beginnt >
, suchen Sie die neue ID aus dem Array, indem Sie das erste Zeichen aus dem aktuellen Datensatz entfernen ( substr($0, 2)
) und diesen Wert als Array-Index verwenden.
Wenn die ID nicht leer ist, drucken Sie >
die ID und springen Sie zum next
Datensatz.
Druckt 1
den aktuellen Datensatz (die Sequenzen oder nicht übereinstimmenden IDs).
Antwort2
awk -F'\t' '
NR==FNR { map[">"$1] = ">"$2; next }
$0 in map { $0 = map[$0] }
{ print }
' mapfile fastafile