2008-12-08 2 views
87

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

+1

Выглядит как дубликат http://stackoverflow.com/questions/746689/unix-tool-to-remove-duplicate-lines-from-a-file – 2010-02-18 21:01:58

+3

Это 1 год; что 10 месяцев. Так, наоборот. – Sydius 2010-02-26 19:50:49

+0

@ Сидиус-консенсус теперь состоит в том, чтобы расставить приоритеты в счете upvote (что у вас также больше): http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even -Но-это-намного-новее-а-ха И это не дубликаты, в которых никто не упоминает Vim :-) – 2016-08-08 08:38:18

ответ

179

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

:sort u 
20

Попробуйте это:
:%s/^\(.*\)\n\1$/\1/

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

+7

он работает. в следующий раз, проверьте это! – hop 2008-12-09 10:22:29

+1

@hop Спасибо за тестирование для меня. В то время у меня не было доступа к vim. – Sean 2008-12-09 20:50:21

+2

это затеняет все повторяющиеся строки для меня, но не удаляет, я пропустил здесь шаг? – ak85 2012-09-14 23:57:47

1

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

0

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

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

4

Я бы объединить два вышеуказанные ответы:

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

1G 
!Gsort 
1G 
!Guniq 

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

0

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

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

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

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

14

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

sort file | uniq > file.new 
0
:%s/^\(.*\)\(\n\1\)\+$/\1/gec 

или

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

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

3

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

Смежные вопросы