Resolví la sed
respuesta poco después de publicar esta pregunta; nadie más ha usadosed
hasta ahora, así que aquí está:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
Un poco de juego con el problema más general (¿qué hay de eliminar líneas en conjuntos de tres? ¿O cuatro o cinco?) Proporcionó la siguiente solución extensible:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
Extendido para eliminar triples de líneas:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
O para eliminar cuadrantes de líneas:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
tiene una ventaja adicional sobre la mayoría de las otras opciones, que es su capacidad de operar realmente en una secuencia, sin necesidad de más almacenamiento de memoria que el número real de líneas para verificar si hay duplicados.
Como Cuonglm señaló en los comentarios , es necesario establecer la configuración regional en C para evitar fallas al eliminar correctamente las líneas que contienen caracteres de varios bytes. Entonces los comandos anteriores se convierten en:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
, de lo contrario, en la configuración regional de varios bytes, los caracteres no válidos en esa configuración regional causarán un error en el comando.No es muy elegante, pero es tan simple como se me ocurre:
El substr () solo recorta la
uniq
salida. Eso funcionará hasta que tenga más de 9,999,999 duplicados de una línea (en cuyo caso, la salida de uniq puede tener más de 9 caracteres).fuente
uniq -c input | awk '{if ($1 %2 == 1) { print $2 } }'
y pareció funcionar igual de bien. ¿Alguna razón por la cual lasubstr
versión es mejor?$2
para$NF
ser más robusto?foo bar
.uniq
(al menos en GNU coreutils) parece usar de manera confiable exactamente 9 caracteres antes del texto en sí; Sin embargo, no puedo encontrar esto documentado en ninguna parte, y no está en las especificaciones POSIX .Prueba este
awk
script a continuación:Se supone que el
lines.txt
archivo está ordenado.La prueba:
fuente
Con
pcregrep
para una muestra dada:o de una manera más general:
fuente
Si la entrada está ordenada:
fuente
pineapple\napple\ncoconut
y la salida espinecoconut
.\n
lugar de$
darle el/m
modificador, pero luego me di cuenta de que$
usaría dejaría una línea en blanco en lugar de líneas eliminadas. Se ve bien ahora; Eliminé la versión incorrecta ya que solo agregaba ruido. :)Me gusta
python
para esto, por ejemplo conpython
2.7+fuente
Como entendí la pregunta, opté por awk, usando un hash de cada registro, en este caso supongo que RS = \ n, pero se puede cambiar para considerar cualquier otro tipo de arreglos, se puede arreglar para considerar un número par de repeticiones, en lugar de las impares, con un parámetro o un pequeño cuadro de diálogo. Cada línea se usa como el hash y su recuento aumenta, al final del archivo se escanea la matriz e imprime cada recuento par del registro. Incluyo el recuento para verificar, pero eliminar una [x] es suficiente para resolver ese problema.
HTH
código de líneas de conteo
Data de muestra:
Ejecución de muestra:
fuente
awk
código, pero desafortunadamenteawk
las matrices asociativas no están ordenadas en absoluto, ni conservan el orden.sort
.!=0
está implícito en cómoawk
convierte los números en valores verdadero / falso, lo que hace que esto se reduzca aawk '{a[$0]++}END{for(x in a)if(a[x]%2)print x}'
Si la entrada está ordenada, ¿qué pasa con esto
awk
?fuente
con perl:
fuente
Usando construcciones de shell,
fuente
$b
).Divertido rompecabezas!
En perl:
Verbosamente en Haskell:
Tersely en Haskell:
fuente
una versión: uso "delimitadores" para simplificar el bucle interno (se supone que la primera línea no es
__unlikely_beginning__
y se supone que el texto no termina con la línea:__unlikely_ending__
y agregue esa línea especial del delimitador al final de las líneas introducidas. El algoritmo puede asumir ambos:)Entonces :
fuente