it-swarm.com.de

Doppelte Zeilen in vi entfernen?

Ich habe eine Textdatei, die eine lange Liste von Einträgen enthält (einen in jeder Zeile). Einige davon sind Duplikate, und ich möchte wissen, ob es möglich ist (und wenn ja, wie), Duplikate zu entfernen. Ich bin daran interessiert, dies möglichst aus vi/vim heraus zu tun.

111
Sydius

Wenn Sie mit dem Sortieren Ihrer Datei einverstanden sind, können Sie Folgendes verwenden:

:sort u
231
Brian Carper

Versuche dies:

:%s/^\(.*\)\(\n\1\)\+$/\1/

Es sucht nach jeder Zeile, auf die unmittelbar eine oder mehrere Kopien von sich selbst folgen, und ersetzt sie durch eine einzelne Kopie.

Machen Sie eine Kopie Ihrer Datei, bevor Sie es versuchen. Es ist ungetestet.

26
Sean

Von der Kommandozeile aus einfach machen:

sort file | uniq > file.new
20
Kevin

awk '!x[$0]++' yourfile.txt, wenn Sie die Reihenfolge beibehalten möchten (d. h. das Sortieren ist nicht akzeptabel). Um es von vim aufzurufen, :! kann verwendet werden.

7
Rovin Bhandari
g/^\(.*\)$\n\1/d

Funktioniert bei mir unter Windows. Die Zeilen müssen jedoch zuerst sortiert werden.

6
Bridgey

Ich würde zwei der obigen Antworten kombinieren:

go to head of file
sort the whole file
remove duplicate entries with uniq

1G
!Gsort
1G
!Guniq

Wenn Sie wissen möchten, wie viele doppelte Zeilen entfernt wurden, überprüfen Sie mit control-G vor und nach dem Entfernen die Anzahl der in Ihrem Puffer vorhandenen Zeilen.

5
Jon DellOro

Wählen Sie die Linien im visuellen Linienmodus (Shift+v), dann :!uniq. Das fängt nur Duplikate, die nacheinander kommen.

3
derobert

Um festzustellen, wie Uniq in VimL implementiert werden kann, suchen Sie nach Uniq in einem Plugin, das ich verwalte . Sie werden verschiedene Möglichkeiten zur Implementierung sehen, die auf der Vim-Mailingliste angegeben sind.

Andernfalls, :sort u ist in der Tat der richtige Weg.

0
Luc Hermitte

Diese Version entfernt nur wiederholte, zusammenhängende Zeilen. Ich meine, löscht nur aufeinanderfolgende wiederholte Zeilen. Unter Verwendung der gegebenen Karte verwechselt die Funktion die leeren Zeilen. Aber wenn Sie die REGEX ändern, um sie an den Zeilenanfang anzupassen, ^ entfernt auch doppelte Leerzeilen.

" function to delete duplicate lines
function! DelDuplicatedLines()
    while getline(".") == getline(line(".") - 1)
        exec 'norm! ddk'
    endwhile
    while getline(".") == getline(line(".") + 1)
        exec 'norm! dd'
    endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>
0
SergioAraujo
:%s/^\(.*\)\(\n\1\)\+$/\1/gec

oder

:%s/^\(.*\)\(\n\1\)\+$/\1/ge

dies ist meine Antwort für Sie, es kann mehrere doppelte Zeilen entfernen und nur eine behalten, nicht entfernen!

0
cn8341

Ich würde ... benutzen !}uniq, aber das funktioniert nur, wenn keine Leerzeilen vorhanden sind.

Verwenden Sie für jede Zeile in einer Datei: :1,$!uniq.

0
Chris Dodd

Dies funktionierte für mich für beide .csv und .txt

awk '!seen[$0]++' <filename> > <newFileName>

Erklärung: Der erste Teil des Befehls druckt eindeutige Zeilen und der zweite Teil, d. H. Nach dem mittleren Pfeil, um die Ausgabe des ersten Teils zu speichern.

awk '!seen[$0]++' <filename>

>

<newFileName>

0
paul

Eine alternative Methode, bei der vi/vim nicht verwendet wird (für sehr große Dateien), ist die Verwendung von sort und uniq über die Linux-Befehlszeile:

sort {file-name} | uniq -u
0
william-1066