Pregunta

Tengo un archivo de texto que contiene una larga lista de entradas (una en cada línea).Algunos de estos son duplicados y me gustaría saber si es posible (y de ser así, cómo) eliminar los duplicados.Estoy interesado en hacer esto desde vi/vim, si es posible.

¿Fue útil?

Solución

Si está de acuerdo con ordenar su archivo, puede usar:

:sort u

Otros consejos

Prueba esto:

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

Busca cualquier línea seguida inmediatamente por una o más copias de sí misma y la reemplaza con una sola copia.

Sin embargo, haga una copia de su archivo antes de intentarlo.No está probado.

Desde la línea de comando simplemente haz:

sort file | uniq > file.new

awk '!x[$0]++' yourfile.txt si desea preservar el orden (es decir, la clasificación no es aceptable). Para invocarlo desde vim, se puede usar :!.

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

Funciona para mí en Windows. Sin embargo, las líneas deben ordenarse primero.

Combinaría dos de las respuestas anteriores:

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

1G
!Gsort
1G
!Guniq

Si estaba interesado en ver cuántas líneas duplicadas se eliminaron, use control-G antes y después para verificar la cantidad de líneas presentes en su búfer.

Seleccione las líneas en modo de línea visual ( Shift + v ), luego :!uniq. Eso solo capturará duplicados que vienen uno tras otro.

En cuanto a cómo se puede implementar Uniq en VimL, ​​busque Uniq en un complemento que estoy manteniendo.Verá varias formas de implementarlo que se proporcionan en la lista de correo de Vim.

De lo contrario, :sort u es de hecho el camino a seguir.

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

o

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

esta es mi respuesta para usted, puede eliminar múltiples líneas duplicadas y ¡solo mantén uno, no lo elimines!

Usaría !}uniq, pero eso solo funciona si no hay líneas en blanco.

Para cada línea en un archivo use: :1,$!uniq.

Esta versión solo elimina las líneas repetidas que están contigo. Quiero decir, solo elimina líneas repetidas consecutivas. Usando el mapa dado, la función nota desordenar con líneas en blanco. Pero si cambia el REGEX para que coincida con el inicio de la línea ^, también eliminará las líneas en blanco duplicadas.

" 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>

Un método alternativo que no usa vi / vim (para archivos muy grandes), es desde la línea de comandos de Linux use sort y uniq:

sort {file-name} | uniq -u

Esto funcionó para mí tanto para .csv como para .txt

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

Explicación: La primera parte del comando imprime filas únicas y la segunda parte, es decir, después de la flecha del medio es guardar la salida de la primera parte.

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

>

<newFileName>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top