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...