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.
11 answers
Jeśli nie masz nic przeciwko sortowaniu plików, możesz użyć:
:sort u
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/
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
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.
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ć :!
.
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.
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.
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.
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ń !
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
.
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>
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