2016-07-11 4 views
0

Ich habe eine große CSV-Datei mit 4 Feldern für jede Zeile in diesem Format (ID1, ID2, score, Elem) Sortierung:csv-Datei der Merging Linie mit denselben Anfang Feldern und sie durch ihre Länge

HALLO, WORLD, 2323 elem1

GOODBYE, BLUESKY, 3232, elem2

hALLO, Welt, 421, elem3

GOODBYE, BLUESKY, 41134, elem4

ETC ...

Ich mag jede Zeile fusionieren, die die gleichen ID1, ID2 Felder auf der gleiche Linie die Partitur Feld eliminiert hat, was zu:

hallo, Welt, elem1, elem3 .....

GOODBYE, BLUESKY, elem2, elem4 .....

ETC ...

wo jedes Elem aus einer anderen Linie kam mit dem gleichen ID1, ID2. Danach möchte ich die Zeilen auf der Grundlage ihrer Länge sortieren.

Ich habe versucht, Codierung in Java zu tun, ist aber superlow. Ich habe online über AWK gelesen, aber ich kann nicht wirklich eine gute Stelle finden, wo ich seine Syntax für CSV-Dateien verstehen kann. Ich habe diesen Befehl verwendet, wie kann ich ihn an meine Bedürfnisse anpassen?

+0

Ändern Sie "$ 2" zu "$ 4" und das sollte es tun. – jas

+0

Ich möchte auch das zweite Feld abgleichen, welches ist die Syntax für eine zusätzliche Bedingung wie a [$ 1] = a [$ 1]? – Aalto

Antwort

1

Ihr Schlüssel sollte zusammengesetzt sein, auch Trennzeichen müssen gesetzt werden, um Komma und Leerzeichen unterzubringen.

$ awk -F', *' -v OFS=', ' '{k=$1 OFS $2; a[k]=k in a?a[k] OFS $4:$4} 
         END{for(k in a) print k, a[k]}' file 

GOODBYE, BLUESKY, elem2, elem4 
HELLO, WORLD, elem1, elem3 

Erläuterung

set Feldseparator (FS) zu Komma mit einem oder mehreren Leerzeichen, und Ausgangsfeldtrenn (OFS), um normalisierte Form (Komma und ein Leerzeichen). Erstellen Sie einen zusammengesetzten Schlüssel aus den ersten zwei Feldern, die mit OFS getrennt sind (da wir es in der Ausgabe verwenden werden). Hängen Sie das vierte Feld an das Array-Element an, das mit dem Schlüssel indiziert ist (behandeln Sie das erste Element special, da wir nicht mit OFS beginnen wollen). Wenn alle Datensätze fertig sind (END-Block), drucken Sie alle Schlüssel und Werte.

Um die Länge hinzuzufügen, halten Sie einen parallelen Zähler und erhöhen Sie jedes Mal, wenn Sie für jeden Schlüssel anhängen, c[k]++ und verwenden Sie es beim Drucken. Das heißt,

$ awk -F', *' -v OFS=', ' '{k=$1 OFS $2; c[k]++; a[k]=k in a?a[k] OFS $4:$4} 
         END{for(k in a) print k, c[k], a[k]}' file | 
    sort -t, -k3n 

GOODBYE, BLUESKY, 2, elem2, elem4 
HELLO, WORLD, 2, elem1, elem3 
+0

vielen Dank für Ihre Zeit, könnte ich Ihnen die syntaktische Erklärung Ihrer Lösung fragen? – Aalto

+0

Die Sache ist, dass ich als drittes Feld auch die Anzahl der Elemente für diese bestimmte Zeile hinzufügen möchte (ID1, ID2, Länge, elem1, elem2, ...), um dieses Feld der Datei zu verwenden. – Aalto

Verwandte Themen