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 si es así, cómo) eliminar los duplicados. Estoy interesado en hacer esto desde vi / vim, si es posible.
                    
                        vim
                                duplicates
                                
                    
                    
                        Sydius
fuente
                
                fuente

Respuestas:
Si está de acuerdo con ordenar su archivo, puede usar:
fuente
:%!uniqpara eliminar las entradas duplicadas sin clasificar el archivo.uPrueba esto:
Busca cualquier línea seguida inmediatamente por una o más copias de sí mismo y la reemplaza con una sola copia.
Sin embargo, haga una copia de su archivo antes de intentarlo. No está probado.
fuente
Desde la línea de comando simplemente haz lo siguiente:
fuente
:sort uestaba colgando en mi archivo grande. Esto funcionó muy rápida y perfectamente. ¡Gracias!'uniq' is not recognized as an internal or external command, operable program or batch file.awk '!x[$0]++' yourfile.txtsi desea conservar el orden (es decir, la clasificación no es aceptable). Para invocarlo desde vim,:!se puede utilizar.fuente
Funciona para mí en Windows. Sin embargo, las líneas deben ordenarse primero.
fuente
aaaaseguida deaaaabbeliminará poraaaaerror.Combinaría dos de las respuestas anteriores:
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.
fuente
'uniq' is not recognized as an internal or external command, operable program or batch file.Seleccione las líneas en modo de línea visual ( Shift+ v), luego
:!uniq. Eso solo detectará duplicados que vengan uno tras otro.fuente
Con respecto a cómo se puede implementar Uniq en VimL, busque Uniq en un complemento que estoy manteniendo . Verá varias formas de implementarlo que se proporcionaron en la lista de correo de Vim.
De lo contrario,
:sort ues de hecho el camino a seguir.fuente
o
Esta es mi respuesta para ti, ¡puede eliminar varias líneas duplicadas y solo mantener una, no eliminar!
fuente
yo usaría
!}uniq, pero eso solo funciona si no hay líneas en blanco.Para cada línea en un archivo de uso:
:1,$!uniq.fuente
Esta versión solo elimina las líneas repetidas que están contigo. Quiero decir, solo borra líneas repetidas consecutivas. Usando el mapa dado, la función nota problemas 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.fuente
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:
fuente
Esto funcionó para mí para ambos
.csvy.txtawk '!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 central, es para guardar la salida de la primera parte.
awk '!seen[$0]++' <filename>><newFileName>fuente