Cómo eliminar líneas duplicadas en un archivo sin ordenarlo en Unix

Resuelto Vijay asked hace 15 años • 9 respuestas

¿Existe alguna forma de eliminar líneas duplicadas en un archivo en Unix?

Puedo hacerlo con los comandos sort -uy uniq, pero quiero usar sedo awk.

¿Es eso posible?

Vijay avatar Sep 18 '09 19:09 Vijay
Aceptado
awk '!seen[$0]++' file.txt

seenes una matriz asociativa a la que AWK pasará cada línea del archivo. Si una línea no está en la matriz, seen[$0]se evaluará como falsa. Es !el operador NOT lógico e invertirá falso en verdadero. AWK imprimirá las líneas donde la expresión se evalúa como verdadera.

Los ++incrementos seenpara que seen[$0] == 1después de la primera vez se encuentre una línea y luego seen[$0] == 2, y así sucesivamente. AWK evalúa todo menos 0y ""(cadena vacía) como verdadero. Si se coloca una línea duplicada, se seenevaluará !seen[$0]como falso y la línea no se escribirá en la salida.

Jonas Elfström avatar Sep 18 '2009 13:09 Jonas Elfström

De http://sed.sourceforge.net/sed1line.txt : (No me pregunten cómo funciona esto ;-))

 # delete duplicate, consecutive lines from a file (emulates "uniq").
 # First line in a set of duplicate lines is kept, rest are deleted.
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # delete duplicate, nonconsecutive lines from a file. Beware not to
 # overflow the buffer size of the hold space, or else use GNU sed.
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
Andre Miller avatar Sep 18 '2009 13:09 Andre Miller