Usuwanie zduplikowanych wierszy w vi?

Mam plik tekstowy, który zawiera długą listę wpisów(po jednym w każdej linii). Niektóre z nich to duplikaty i chciałbym wiedzieć, czy możliwe jest (a jeśli tak, to jak) usunięcie duplikatów. Jestem zainteresowany zrobieniem tego z VI / vim, jeśli to możliwe.

Author: Sydius, 2008-12-09

11 answers

Jeśli nie masz nic przeciwko sortowaniu plików, możesz użyć:

:sort u
 200
Author: Brian Carper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 22:32:20

Spróbuj tego:
:%s/^\(.*\)\n\1$/\1/

Zrób kopię, zanim spróbujesz. To nieprzetestowane.
 22
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 22:27:36

Z linii poleceń wykonaj:

sort file | uniq > file.new
 17
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 10:36:27
g/^\(.*\)$\n\1/d

Działa dla mnie na Windows. Linie muszą być najpierw sortowane.

 5
Author: Bridgey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-01 18:23:37

awk '!x[$0]++' yourfile.txt jeśli chcesz zachować kolejność (np. sortowanie jest niedopuszczalne). Aby wywołać go z Vima, można użyć :!.

 5
Author: Rovin Bhandari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 12:38:40

Połączyłbym dwie z powyższych odpowiedzi:

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

1G
!Gsort
1G
!Guniq

Jeśli chcesz zobaczyć, ile zduplikowanych linii zostało usuniętych, użyj control-G przed i po, aby sprawdzić liczbę linii obecnych w Twoim buforze.

 4
Author: Jon DellOro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 01:16:21

Wybierz linie w trybie visual-line (Shift+v), Następnie :!uniq. To złapie tylko duplikaty, które przychodzą jeden po drugim.

 2
Author: derobert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 10:37:19

Jeśli chodzi o sposób implementacji Uniq w Vimlu, poszukaj Uniq w pluginie, który utrzymuję . Zobaczysz różne sposoby jego implementacji, które zostały podane na liście mailingowej Vima.

W Przeciwnym Razie, :sort u jest rzeczywiście droga do zrobienia.

 0
Author: Luc Hermitte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 10:05:48
:%s/^\(.*\)\(\n\1\)\+$/\1/gec

Lub

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

To jest moja odpowiedź dla ciebie, może usunąć wiele zduplikowanych linii i Zachowaj tylko jeden, a nie Usuń !

 0
Author: cn8341,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 06:45:51

Użyłbym !}uniq, ale to działa tylko wtedy, gdy nie ma pustych linii.

Dla każdego wiersza w pliku użyj: :1,$!uniq.

 0
Author: Chris Dodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 10:37:00

Ta wersja usuwa tylko powtarzające się linie, które są sąsiadujące. Usuwa tylko kolejne powtarzające się linie. Korzystając z podanej mapy funkcja notuje bałagan z pustymi liniami. Ale jeśli zmienisz Wyrażenie regularne, aby dopasować początek linii ^, usunie również zduplikowane puste linie.

" 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
Author: SergioAraujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 20:36:00