Ich habe eine lange CSV-Datei mit zwei Spalten, die Serien von aufeinanderfolgenden Duplikaten wie diese enthält:
...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...
Ich muss alle diese Duplikate außer dem letzten löschen – die Ausgabe für das obige Beispiel wäre also:
...
1500,1533
1554,1728
1593,1766
...
Außerdem muss ich die restlichen Zeilen in der Datei in ihrer ursprünglichen Reihenfolge beibehalten.
Ich habe versucht tac file.csv | sort -k1,1 -r -u -t,
aber das brachte nicht das gewünschte Ergebnis und sortierbasierte Funktionen brachten meine Zeilenreihenfolge durcheinander.
Akzeptierte Antwort:
Mit sed
:
sed '$!N;/\(.*,\).*\n\1/!P;D' infile
N
bedeutet, dass im Musterraum immer zwei aufeinanderfolgende Zeilen stehen und sed
P
gibt das erste von ihnen nur aus, wenn das erste Feld in dieser Zeile nicht dasselbe ist wie das erste Feld in der zweiten Zeile. Dann D
entfernt die erste Zeile aus dem Musterbereich und startet den Zyklus neu.
Ein anderer Weg mit gnu datamash
(vorausgesetzt, Ihre Datei ist als datamash
sortiert erfordert sortierte Eingabe):
datamash -t ',' -g 1 last 2 <infile
Dieses g
gruppiert den ,
begrenzte Eingabe durch 1
st-Feld, wobei nur der last
ausgegeben wird Wert (von 2
Spalte) jeder Gruppe.
Wenn Ihre Datei nicht sortiert ist datamash
kann per -s
sortiert werden :
datamash -t ',' -s -g 1 last 2 <infile
aber das bedeutet, dass die anfängliche Reihenfolge der Zeilen nicht beibehalten wird. Dies kann also nicht das tun, was Sie wollen. In diesem Fall könnten Sie sed
verwenden /awk
/perl
usw...