2017-11-29 6 views
2

Ich möchte doppelte Zeilen aus einer CSV-Datei entfernen und die Werte einer bestimmten Spalte (in diesem Fall Spalte2) verketten.So entfernen Sie doppelte Zeilen und verketten Werte aus einer Spalte in CSV

Eingang

ID column2 column3 column4, etc.... 
1 a  test3 test4 
1 r  test3 test4 
1 c  test3 test4 
2 r  test3 test4 
2 o  test3 test4 
3 a  test3 test4 
4 b  test3 test4 
4 c  test3 test4 
4 e  test3 test4 

Erwartetes Ergebnis

ID column2 column3 column4, etc.... 
1 a|r|c test3 test4 
2 r|o  test3 test4 
3 a  test3 test4 
4 b|c|e test3 test4 

Ist es möglich, mit awk?

+1

Sind Spalte 3 und 4 konstant? –

+0

@glennjackman Es gibt mehr als 4 Spalten. Und ja, sie sind konstant. – KIWOP

Antwort

0

Dies könnte für Sie arbeiten (GNU sed & Spalte):

sed -r '1b;:a;$!N;s/^(\s*\S+\s)(\S+)\s*(\S+\s*\S+\s*)(.*)n\1(\S+)\s*\3/\1\2|\5 \3\4/;ta;P;D' file | column -t 

Pattern Match auf allen Linien mit Ausnahme der ersten und formatieren Sie das erwartete Ergebnis Referenzen mit zurück und die Spalte Befehl.

N.B. Das erste Feld ist von seinem Leerraum befreit.

+0

Es gibt mehr als 4 Spalten. Und kein Leerzeichen in der ersten. Vielen Dank. – KIWOP

+0

@KIWOP siehe bearbeiten – potong

0

Mit awk, für variable Spalte, für den allgemeinen Fall, in dem sich alle anderen Spalten ändern können.

awk -v col=2 -v OFS="\t" '{ 
    temp=$col 
    $col="" 
    a[$0]=a[$0]? a[$0] "|" temp: temp 
} 
END {for (i in a) { 
     split(i, b) 
     for (j=1; j<=length(b); j++) { 
      if (j==col) printf a[i] OFS 
      printf b[j] OFS 
     } 
     printf ORS 
    } 
}' file |sort -n |column -t 

Dies verwendet eine assoziative Array mit der Linie $col als Index ohne und um es den Wert von $col hängen.

Bei der END achten wir darauf, $col während des Druckens wieder an seinen Platz zu bringen, indem Sie Felder in ein anderes Array aufteilen.

Die Reihenfolge der Ausgabe ist unbestimmt und Sie können sie an sort für jede Sortierart pro Feld pipen. Und zu column -t, wenn Sie so brauchen.

+0

die Werte in anderen Spalten können Text (mehr als ein Wort) sein. – KIWOP

+0

Dann müssen Sie ein anderes Trennzeichen als Registerkarte verwenden, wenn Sie Ihre CSV-Daten erhalten und dann das Trennzeichen "awk" entsprechend einstellen. Dieser 'FS' sollte auch innerhalb der obigen 'Split'-Funktion verwendet werden. Ich sehe nicht, warum Sie Tab-getrennte Datei erhalten, wenn Sie einfachen Text als Felder haben. – thanasisp

Verwandte Themen