Mam plik tekstowy zawierający długą listę wpisów (po jednym w każdym wierszu). Niektóre z nich są duplikatami i chciałbym wiedzieć, czy można (a jeśli tak, w jaki sposób) usunąć jakiekolwiek duplikaty. Jeśli to możliwe, jestem zainteresowany zrobieniem tego z poziomu vi / vim.
vim
duplicates
Sydius
źródło
źródło
Odpowiedzi:
Jeśli nie masz nic przeciwko sortowaniu pliku, możesz użyć:
źródło
:%!uniq
aby po prostu usunąć zduplikowane wpisy bez sortowania pliku.u
Spróbuj tego:
Wyszukuje dowolny wiersz, po którym bezpośrednio następuje jedna lub więcej kopii samego siebie i zastępuje go pojedynczą kopią.
Zanim jednak spróbujesz, zrób kopię swojego pliku. To nie zostało przetestowane.
źródło
Z linii poleceń po prostu wykonaj:
źródło
:sort u
wisiało na moim dużym pliku. Działało to bardzo szybko i doskonale. Dziękuję Ci!'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
jeśli chcesz zachować kolejność (np. sortowanie jest niedopuszczalne). Aby wywołać go z vima,:!
można użyć.źródło
U mnie działa w systemie Windows. Jednak linie muszą być najpierw posortowane.
źródło
aaaa
po którymaaaabb
nastąpi, spowodujeaaaa
błędne usunięcie .Połączyłbym dwie z powyższych odpowiedzi:
Jeśli chciałbyś zobaczyć, ile zduplikowanych linii zostało usuniętych, użyj control-G przed i po, aby sprawdzić liczbę linii obecnych w twoim buforze.
źródło
'uniq' is not recognized as an internal or external command, operable program or batch file.
Następnie zaznacz linie w trybie linii wizualnych ( Shift+ v)
:!uniq
. To wyłapie tylko duplikaty, które pojawiają się jeden po drugim.źródło
Jeśli chodzi o sposób implementacji Uniqa w VimL, wyszukaj Uniq we wtyczce, którą utrzymuję . Zobaczysz różne sposoby implementacji, które zostały podane na liście mailingowej Vima.
W przeciwnym razie
:sort u
jest to droga do zrobienia.źródło
lub
to jest moja odpowiedź dla ciebie, może usunąć wiele zduplikowanych linii i zachować tylko jedną, której nie można usunąć!
źródło
Użyłbym
!}uniq
, ale to działa tylko wtedy, gdy nie ma pustych linii.Dla każdego wiersza w użyciu pliku:
:1,$!uniq
.źródło
Ta wersja usuwa tylko powtarzające się linie, które są ciągłe. Mam na myśli, że usuwa tylko kolejne, powtarzające się wiersze. Używając podanej mapy, funkcja zwraca uwagę na puste linie. Ale jeśli zmienisz REGEX, aby pasował do początku wiersza
^
, usunie to również zduplikowane puste wiersze.źródło
Alternatywną metodą, która nie używa vi / vim (dla bardzo dużych plików), jest użycie sort i uniq z wiersza poleceń Linuksa:
źródło
To działało dla mnie zarówno w przypadku, jak
.csv
i.txt
awk '!seen[$0]++' <filename> > <newFileName>
Objaśnienie: Pierwsza część polecenia drukuje unikalne wiersze, a druga część, tj. Po środkowej strzałce, ma na celu zapisanie wyniku pierwszej części.
awk '!seen[$0]++' <filename>
>
<newFileName>
źródło