vim: видалити всі рядки, але унікальні?


4

Я шукаю спосіб у VIM видалити всі рядки, що є дублікатами, і залишити лише унікальні рядки, які існують у файлі. Я вважаю за краще макрос, але команда чи функція були б чудовими.

Скажіть, у мене є файл із повторюваними рядками та унікальними елементами:

1Apple
1Apple
2Peach
2Peach
2Peach
3Beer
4Banana
4Banana
4Banana

Я хочу видалити всі рядки, щоб усе, що залишилося:

3Beer

Єдина унікальна лінія, яку я дійсно хочу.

Я використовую sort u весь час, щоб отримати унікальний список, видаляючи дублікати, але в мене є раз, мені просто потрібна унікальна лінія у файлі.

Будь-які ідеї, як вирішити цю справу в VIM?


Використовуйте правильний інструмент для виконання цього виду робіт .... використовуйте uniq, який використовується для цього типу речей.
mdpc

Відповіді:


5

Це можна зробити за допомогою команди заміну та зворотної референції:

s/^\(.*\)\(\n\1\)\+//

Зауважте, що це працює лише в тому випадку, якщо рядки сортовані. Це працює, якщо один чи декілька разів підключити та видалити першу групу в наступному рядку.


Оскільки у мене немає Uniq, я зробив макрос у VIM, щоб переосмислити та видалити неповторні елементи. Дякую.
7нул

4

Ви можете використовувати команду "uniq", щоб зробити це -

uniq -u ім'я файлу для перевірки.txt

і ви можете навіть запустити його як фільтр всередині Vim ... було б круто, якби ваша відповідь містила це ...
0xC0000022L

1
:%!sort | uniq -uзробить саме це: сортуйте, видаліть усі рядки, які не є унікальними, і залиште результат у файлі.
андерсонвом

2
  1. Виберіть усі лінії, які потрібно фільтрувати.

  2. Так :'<,'>!uniq -u<CR>, '<,'>діапазон додається автоматично для вас.

Якщо ви хочете відфільтрувати весь буфер, нічого не вибирайте, а просто робіть :%!uniq -u<CR>.

Про фільтри ви можете прочитати в :h filter.


Я вважаю, uniq це не варіант у Windows 7?
липня

Я поняття не маю. Може, з чимось на кшталт Cygwin? Ви повинні були це вказати. Усі відповіді тут марні, якщо у вас немає на комп'ютері uniq.
romainl

2
Так, я мав би згадати вікна. Це була одна з причин, коли я запитав про макрос, щоб спробувати зберегти його в vim. Я зміг написати макрос навколо рекомендованого s / ^ (. *) (\ N \ 1) \ + //, і він працював нормально для 50k рядків.
липня

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.