У меня есть текстовый файл, содержащий длинный список записей (по одному на каждую строку). Некоторые из них являются дубликатами, и я хотел бы знать, возможно ли (и если да, как) удалить любые дубликаты. Мне интересно делать это из vi/vim, если это возможно.
Удаление повторяющихся строк в vi?
Ответ 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
это мой ответ для вас, он может удалить несколько повторяющихся строк и только держите его не удалять!