Ich habe eine Textdatei, die eine lange Liste von Einträgen enthält (einen in jeder Zeile). Einige davon sind Duplikate, und ich würde gerne wissen, ob es möglich ist (und wenn ja, wie), Duplikate zu entfernen. Ich bin daran interessiert, dies möglichst innerhalb von vi / vim zu tun.
vim
duplicates
Sydius
quelle
quelle
Antworten:
Wenn Sie mit dem Sortieren Ihrer Datei einverstanden sind, können Sie Folgendes verwenden:
quelle
:%!uniq
entfernen Sie einfach doppelte Einträge, ohne die Datei zu sortieren.u
Versuche dies:
Es sucht nach einer Zeile, unmittelbar gefolgt von einer oder mehreren Kopien von sich selbst, und ersetzt sie durch eine einzelne Kopie.
Erstellen Sie jedoch eine Kopie Ihrer Datei, bevor Sie sie ausprobieren. Es ist ungetestet.
quelle
Führen Sie über die Befehlszeile einfach Folgendes aus:
quelle
:sort u
sie an meiner großen Datei hing. Das hat sehr schnell und perfekt funktioniert. Danke dir!'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
Wenn Sie die Reihenfolge beibehalten möchten (dh das Sortieren ist nicht akzeptabel). Um es von vim aus aufzurufen,:!
kann verwendet werden.quelle
Funktioniert für mich unter Windows. Zeilen müssen jedoch zuerst sortiert werden.
quelle
aaaa
gefolgt vonaaaabb
wirdaaaa
fälschlicherweise gelöscht .Ich würde zwei der obigen Antworten kombinieren:
Wenn Sie sehen möchten, wie viele doppelte Zeilen entfernt wurden, verwenden Sie vorher und nachher Strg-G, um die Anzahl der in Ihrem Puffer vorhandenen Zeilen zu überprüfen.
quelle
'uniq' is not recognized as an internal or external command, operable program or batch file.
Wählen Sie dann die Linien im visuellen Linienmodus ( Shift+ v) aus
:!uniq
. Das fängt nur Duplikate auf, die nacheinander kommen.quelle
Suchen Sie in einem von mir verwalteten Plugin nach Uniq, um herauszufinden, wie Uniq in VimL implementiert werden kann . Sie werden verschiedene Möglichkeiten zur Implementierung sehen, die auf der Vim-Mailingliste angegeben wurden.
Ansonsten
:sort u
ist in der Tat der Weg zu gehen.quelle
oder
Dies ist meine Antwort für Sie, es kann mehrere doppelte Zeilen entfernen und nur eine behalten, nicht entfernen!
quelle
Ich würde verwenden
!}uniq
, aber das funktioniert nur, wenn es keine Leerzeilen gibt.Verwenden Sie für jede Zeile in einer Datei :
:1,$!uniq
.quelle
Diese Version entfernt nur wiederholte Zeilen, die zusammenhängend sind. Ich meine, löscht nur aufeinanderfolgende wiederholte Zeilen. Bei Verwendung der angegebenen Karte stellt die Funktion fest, dass Leerzeilen durcheinander geraten. Wenn Sie den REGEX jedoch so ändern, dass er mit dem Zeilenanfang übereinstimmt
^
, werden auch doppelte Leerzeilen entfernt.quelle
Eine alternative Methode, die vi / vim nicht verwendet (für sehr große Dateien), ist die Verwendung von sort und uniq in der Linux-Befehlszeile:
quelle
Dieser arbeitete für mich für beide
.csv
und.txt
awk '!seen[$0]++' <filename> > <newFileName>
Erläuterung: Der erste Teil des Befehls druckt eindeutige Zeilen und der zweite Teil, dh nach dem mittleren Pfeil, dient zum Speichern der Ausgabe des ersten Teils.
awk '!seen[$0]++' <filename>
>
<newFileName>
quelle