Удаление дублирующихся строк в vi? - PullRequest
110 голосов
/ 09 декабря 2008

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

Ответы [ 13 ]

228 голосов
/ 09 декабря 2008

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

:sort u
25 голосов
/ 09 декабря 2008

Попробуйте это:

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

Он ищет любую строку, за которой сразу следует одна или несколько копий, и заменяет ее одной копией.

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

20 голосов
/ 11 апреля 2011

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

sort file | uniq > file.new
7 голосов
/ 04 августа 2016

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

6 голосов
/ 01 ноября 2009
g/^\(.*\)$\n\1/d

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

5 голосов
/ 09 декабря 2008

Я бы объединил два ответа выше:

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

1G
!Gsort
1G
!Guniq

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

3 голосов
/ 09 декабря 2008

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

0 голосов
/ 17 октября 2018

Это сработало для меня как .csv, так и .txt

awk '!seen[$0]++' <filename> > <newFileName>

Пояснение: Первая часть команды печатает уникальные строки, а вторая часть, то есть после средней стрелки, должна сохранять выходные данные первой части.

awk '!seen[$0]++' <filename>

>

<newFileName>

0 голосов
/ 16 октября 2018

Альтернативный метод, который не использует vi / vim (для очень больших файлов), из командной строки Linux использует sort и uniq:

sort {file-name} | uniq -u
0 голосов
/ 19 марта 2018

Эта версия удаляет только повторяющиеся строки, которые являются сомнительными. Я имею в виду, только удаляет последовательные повторяющиеся строки. Используя данную карту, функция не запутывается в пустых строках. Но если изменить значение REGEX на начало строки ^, оно также удалит дублирующиеся пустые строки.

" function to delete duplicate lines
function! DelDuplicatedLines()
    while getline(".") == getline(line(".") - 1)
        exec 'norm! ddk'
    endwhile
    while getline(".") == getline(line(".") + 1)
        exec 'norm! dd'
    endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>
...