Ersetzen der Sequenz-IDs der Fasta-Datei basierend auf den neuen IDs aus einer Liste

Ersetzen der Sequenz-IDs der Fasta-Datei basierend auf den neuen IDs aus einer Liste

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, awobei Sie das erste Feld als Index verwenden. Springen Sie zum nextDatensatz.

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 nextDatensatz.

Druckt 1den 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

verwandte Informationen