Wie kann ich die Zeilen zweier Dateien zusammenführen, indem ich gemeinsame Header habe?

8

Ich möchte zwei Dateien basierend auf den darin enthaltenen gemeinsamen Daten als Header zusammenführen.

Es folgt das Beispiel

Datei1

>Feature scaffold1
1   100  g
101 200  g
201 300  g
>Feature scaffold2
1   100  g
01  500  g
>Feature scaffold3
10  500  g
>Feature scaffold4
10  300  g

Datei 2

>Feature scaffold1
500 500 r
900 1000    r
>Feature scaffold2
200 300 r
>Feature scaffold3
100 200 r
>Feature scaffold4
500 600 r
>Feature scaffold5
1   1000    r

Und hier ist die Art von Ausgabe, die ich möchte:

>Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold2
1   100 g
01  500 g
200 300 r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r
>Feature scaffold5
1   1000    r

Ich habe etwas awk und sed ausprobiert, war aber eindeutig nicht erfolgreich. Wie kann ich das tun?

Namrata Patel
quelle

Antworten:

7

Awk Lösung:

awk '/^>/{ k=$1 FS $2 }
     NR==FNR{ 
         if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0; next
     }
     k in a{ 
         print $0 ORS a[k]; delete a[k]; next 
     }1' file1 file2
  • /^>/{ k=$1 FS $2 }- bei Begegnung mit der Kopfzeile (dh >Feature ...) - einen Schlüssel kaus dem 1. $1und 2. $2Feld zusammenstellen
  • NR==FNR{ ... }- Verarbeitung der 1. Eingabedatei ( file1):
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0- Sammeln Sie Nicht-Header- Zeilen amit dem aktuellen Schlüssel im Arrayk
    • next - Zum nächsten Datensatz springen
  • k in a- Wenn sich der aktuelle file2Datensatz basierend auf dem Datensatz im Array befindet a(basierend auf den file1Datensätzen):
    • print $0 ORS a[k] - Zugehörige Datensätze drucken
    • delete a[k] - verarbeitete Artikel löschen

Die Ausgabe:

>Feature scaffold1
1   100  g
101 200  g
201 300  g
500 500 r
900 1000    r
>Feature scaffold2
1   100  g
01  500  g
200 300 r
>Feature scaffold3
10  500  g
100 200 r
>Feature scaffold4
10  300  g
500 600 r
>Feature scaffold5
1   1000    r
RomanPerekhrest
quelle
4

Ein anderer Ansatz und um es einfacher zu machen.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])
αғsнιη
quelle