Удаление повторяющихся строк в vi?

У меня есть текстовый файл, содержащий длинный список записей (по одному на каждую строку). Некоторые из них являются дубликатами, и я хотел бы знать, возможно ли (и если да, как) удалить любые дубликаты. Мне интересно делать это из vi/vim, если это возможно.

Ответ 1

Если вы в порядке с сортировкой своего файла, вы можете использовать:

:sort u

Ответ 2

Попробуйте следующее:
:%s/^\(.*\)\n\1$/\1/

Сделайте копию, прежде чем попробовать. Он не проверен.

Ответ 3

Из командной строки просто выполните:

sort file | uniq > file.new

Ответ 4

Я бы совпадал с двумя ответами выше:

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

1G
!Gsort
1G
!Guniq

Если вам было интересно увидеть, сколько дублированных строк было удалено, используйте control-G до и после, чтобы проверить количество строк в вашем буфере.

Ответ 5

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

Работает для меня в Windows. Сначала нужно сортировать строки.

Ответ 6

awk '!x[$0]++' yourfile.txt, если вы хотите сохранить заказ (т.е. сортировка неприемлема). Чтобы вызвать его из vim, можно использовать :!.

Ответ 7

Выберите линии в режиме визуальной линии (Shift + v), затем :!uniq. Это будет ловить только дубликаты, которые появляются один за другим.

Ответ 8

Я бы использовал !}uniq, но это работает только в том случае, если нет пустых строк.

Для каждой строки в файле используйте: :1,$!uniq.

Ответ 9

Относительно того, как Uniq может быть реализован в VimL, ​​найдите Uniq в плагине который я поддерживаю. Вы увидите различные способы его реализации, которые были предоставлены в почтовом списке Vim.

В противном случае :sort u действительно подходит.

Ответ 10

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

или

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

это мой ответ для вас, он может удалить несколько повторяющихся строк и только держите его не удалять!