Eu tenho um arquivo de texto que contém uma longa lista de entradas (uma em cada linha). Algumas delas são duplicadas, e eu gostaria de saber se é possível (e se sim, como) remover as duplicatas. Estou interessado em fazer isso no vi / vim, se possível.
vim
duplicates
Sydius
fonte
fonte
Respostas:
Se você estiver bem em classificar seu arquivo, poderá usar:
fonte
:%!uniq
para simplesmente remover entradas duplicadas sem classificar o arquivo.u
Tente o seguinte:
Ele procura por qualquer linha seguida imediatamente por uma ou mais cópias de si mesma e a substitui por uma única cópia.
Faça uma cópia do seu arquivo antes de tentar. Não foi testado.
fonte
Na linha de comando, faça:
fonte
:sort u
estava pendurada no meu arquivo grande. Isso funcionou muito rápido e perfeitamente. Obrigado!'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
se você deseja preservar o pedido (ou seja, a classificação não é aceitável). Para invocá-lo do vim,:!
pode ser usado.fonte
Funciona para mim no Windows. Porém, as linhas devem ser classificadas primeiro.
fonte
aaaa
seguido poraaaabb
excluiráaaaa
erroneamente.Eu combinaria duas das respostas acima:
Se você estava interessado em ver quantas linhas duplicadas foram removidas, use control-G antes e depois para verificar o número de linhas presentes no seu buffer.
fonte
'uniq' is not recognized as an internal or external command, operable program or batch file.
Selecione as linhas no modo de linha visual ( Shift+ v) e, em seguida
:!uniq
. Isso só pega duplicatas que vêm uma após a outra.fonte
Sobre como o Uniq pode ser implementado no VimL, procure o Uniq em um plugin que estou mantendo . Você verá várias maneiras de implementá-lo, fornecidas na lista de discussão do Vim.
Caso contrário,
:sort u
é realmente o caminho a percorrer.fonte
ou
esta é a minha resposta para você, ele pode remover várias linhas duplicadas e manter apenas uma que não seja removida!
fonte
Eu usaria
!}uniq
, mas isso só funciona se não houver linhas em branco.Para cada linha em um uso arquivo:
:1,$!uniq
.fonte
Esta versão remove apenas linhas repetidas que são contíguas. Quero dizer, apenas exclui linhas repetidas consecutivas. Usando o mapa fornecido, a função nota bagunçar as linhas em branco. Mas se alterar o REGEX para corresponder ao início da linha,
^
ele também removerá as linhas em branco duplicadas.fonte
Um método alternativo que não usa o vi / vim (para arquivos muito grandes) é da linha de comando do Linux use sort e uniq:
fonte
Isso funcionou para mim para ambos
.csv
e.txt
awk '!seen[$0]++' <filename> > <newFileName>
Explicação: A primeira parte do comando imprime linhas exclusivas e a segunda parte, ou seja, após a seta do meio é salvar a saída da primeira parte.
awk '!seen[$0]++' <filename>
>
<newFileName>
fonte