Ответ 1
Если вы в порядке с сортировкой своего файла, вы можете использовать:
:sort u
У меня есть текстовый файл, содержащий длинный список записей (по одному на каждую строку). Некоторые из них являются дубликатами, и я хотел бы знать, возможно ли (и если да, как) удалить любые дубликаты. Мне интересно делать это из vi/vim, если это возможно.
Если вы в порядке с сортировкой своего файла, вы можете использовать:
:sort u
Попробуйте следующее: :%s/^\(.*\)\n\1$/\1/
Сделайте копию, прежде чем попробовать. Он не проверен.
Из командной строки просто выполните:
sort file | uniq > file.new
Я бы совпадал с двумя ответами выше:
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
Если вам было интересно увидеть, сколько дублированных строк было удалено, используйте control-G до и после, чтобы проверить количество строк в вашем буфере.
g/^\(.*\)$\n\1/d
Работает для меня в Windows. Сначала нужно сортировать строки.
awk '!x[$0]++' yourfile.txt
, если вы хотите сохранить заказ (т.е. сортировка неприемлема). Чтобы вызвать его из vim, можно использовать :!
.
Выберите линии в режиме визуальной линии (Shift + v), затем :!uniq
. Это будет ловить только дубликаты, которые появляются один за другим.
Я бы использовал !}uniq
, но это работает только в том случае, если нет пустых строк.
Для каждой строки в файле используйте: :1,$!uniq
.
Относительно того, как Uniq может быть реализован в VimL, найдите Uniq в плагине который я поддерживаю. Вы увидите различные способы его реализации, которые были предоставлены в почтовом списке Vim.
В противном случае :sort u
действительно подходит.
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
или
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
это мой ответ для вас, он может удалить несколько повторяющихся строк и только держите его не удалять!