Eliminar línea si la siguiente línea es la misma

15

¿Qué comando sed / awk puedo usar? Solo sort -ueliminará todas las instancias

Entrada:

abc
abc
def
abc
abc
def

Rendimiento esperado:

abc
def
abc
def
干 猕猴桃
fuente

Respuestas:

36

Para eso es el uniqcomando estándar.

uniq your-file

Tenga en cuenta que algunas uniqimplementaciones como GNU uniqle darán la primera de una secuencia de líneas que se ordenan igual (donde strcoll()devuelve 0) en lugar de ser byte a byte idénticas (donde memcmp()o strcmp()devuelve 0). Para forzar una comparación byte a byte independientemente de la uniqimplementación, puede forzar la configuración regional Ccon:

LC_ALL=C uniq your-file
Stéphane Chazelas
fuente
7

Vim puede lograr esto muy bien:

:g/\v^(.*\n)\1/d

O si prefiere usar vim como una herramienta de línea de comandos, puede hacerlo como

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

De esta manera, no tienes que luchar para salir de VIM más tarde;)

Explicación:

:g/

En todas las líneas que coinciden con esta expresión regular ...

\v^(.*\n)\1

Cualquier línea seguida por sí misma ...

/d

ejecute el comando d elete (elimine la línea actual). El -c "wq"es guardar los cambios y salir.

James
fuente
Tenga en cuenta que con vim 8.1.2112 al menos, no funciona para líneas duplicadas que son las dos últimas líneas del archivo. Además, solo elimina un duplicado de las secuencias de 3 líneas duplicadas.
Stéphane Chazelas
1
@ StéphaneChazelas, excepto que actualmente no tenemos especificaciones para el comportamiento deseado en el caso de 3 líneas: pude ver el comportamiento deseado en ambos sentidos.
D. Ben Knoble