vim - repetidas - ¿Quitar filas duplicadas en vi?
filas repetidas en excel (11)
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, utilice control-G antes y después para verificar el número de líneas presentes en su búfer.
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 en caso afirmativo, cómo) eliminar los duplicados. Me interesa hacer esto desde vi / vim, si es posible.
Desde la línea de comando solo hazlo:
sort file | uniq > file.new
En cuanto a cómo Uniq se puede implementar en VimL, busco Uniq en un complemento que estoy manteniendo . Verá varias formas de implementarlo que se dieron en la lista de correo de Vim.
De lo contrario :sort u
es, de hecho, el camino a seguir.
Esta versión solo elimina líneas repetidas que son contundentes. Quiero decir, solo borra líneas repetidas consecutivas. Usando el mapa dado, la función nota desorden 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>
Prueba esto:
:%s/^/(.*/)/n/1$//1/
Haga una copia antes de intentarlo. No está probado.
Seleccione las líneas en el modo de línea visual ( Shift + v ), luego :!uniq
. Eso solo atrapará duplicados que vendrán uno tras otro.
Si está de acuerdo con ordenar su archivo, puede usar:
:sort u
Yo usaría !}uniq
, pero eso solo funciona si no hay líneas en blanco.
Para cada línea en un archivo use :1,$!uniq
.
awk ''!x[$0]++'' yourfile.txt
si desea conservar el orden (es decir, la clasificación no es aceptable). Para invocarlo desde vim, :!
puede ser usado.
:%s/^/(.*/)/(/n/1/)/+$//1/gec
o
:%s/^/(.*/)/(/n/1/)/+$//1/ge
esta es mi respuesta para ti, puede eliminar múltiples líneas duplicadas y solo mantener una no eliminar!
g/^/(.*/)$/n/1/d
Funciona para mí en Windows. Las líneas deben ser ordenadas primero.