Wie kann ich awk
in der folgenden Situation verwenden?
Ich möchte Zeilen verketten, die mit derselben Spalte beginnen. Nur die erste Säule gehalten wird , nachdem die Verbindung (in diesem Fall aaa
, www
, hhh
).
Die Datei kann durch Leerzeichen oder Tabulatoren getrennt sein.
Beispiel Eingabe:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Gewünschte Ausgabe:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
Hintergrund ist, dass ich eine sehr einfache dateibasierte Datenbank einrichten möchte, bei der die erste Spalte immer die Kennung für die Entität ist. Alle Zeilen, die auf derselben Bezeichnerspalte basieren, werden verkettet.
text-processing
sed
awk
winzig
quelle
quelle
uuu
Zeile (in der Ausgabe)?Antworten:
Um die ersten Spalten in jeder Zeile mit awk zu erhalten, können Sie folgende Schritte ausführen:
Dies sind Ihre Schlüssel für den Rest der Zeilen. Sie können also eine Hash-Tabelle erstellen, indem Sie die erste Spalte als Schlüssel und die zweite Spalte der Zeile als Wert verwenden:
Um den gesamten Rest der Zeile, beginnend mit Spalte 2, zu erhalten, müssen Sie alle Spalten sammeln:
quelle
Jemand anderes kann in awk oder sed antworten, aber eine Python-Version ist unkompliziert und kann für Sie hilfreich sein.
quelle
Dies ist eher eine interessante Anwendung von coreutils. Ich vermute, dass sie bei großen Eingaben nicht sehr effizient ist, da sie einen Join für jede Zeile in der Eingabe aufruft.
Um die Effizienz zu verbessern, kann es hilfreich sein, Daten zu speichern
outfile
undtmp
eine RAM-Disk zu erstellen.Bearbeiten
Oder ohne temporäre Dateien:
quelle
Und hier ist ein PERL-Einzeiler:
quelle