GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Aufeinanderfolgende Zeilen in CSV mit doppelten Werten in einem Feld löschen, aber die letzte Zeile beibehalten?

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


Linux
  1. Kopieren und Einfügen in der Linux-Befehlszeile mit xclip

  2. Wie kann man die Zeilen einer Datei durchlaufen?

  3. Alte Protokolldateien außer der letzten löschen (alphanumerisch sortiert)?

  4. Das Alter der ältesten Datei in einer Zeile finden oder Null zurückgeben?

  5. Mit ein paar kleinen Änderungen ein paar Zeilen in einer Textdatei duplizieren?

Nur die erste Zeile aus jeder Folge aufeinanderfolgender Zeilen beibehalten, die einem Muster entsprechen?

Sortieren, aber Kopfzeile oben lassen?

So verwenden Sie sed, um die letzten n Zeilen einer Datei zu entfernen

Was ist falsch an meinem Bash-Skript, um die letzten x Dateien zu behalten und den Rest zu löschen?

Wie drucke ich die letzte Zeile einer gz-komprimierten Datei in der Befehlszeile?

Grep-Zeilen beginnend mit 1, aber nicht 10, 11, 100 usw