Cómo eliminar líneas duplicadas en un archivo sin ordenarlo en Unix
¿Existe alguna forma de eliminar líneas duplicadas en un archivo en Unix?
Puedo hacerlo con los comandos sort -u
y uniq
, pero quiero usar sed
o awk
.
¿Es eso posible?
awk '!seen[$0]++' file.txt
seen
es 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 seen
para que seen[$0] == 1
después de la primera vez se encuentre una línea y luego seen[$0] == 2
, y así sucesivamente. AWK evalúa todo menos 0
y ""
(cadena vacía) como verdadero. Si se coloca una línea duplicada, se seen
evaluará !seen[$0]
como falso y la línea no se escribirá en la salida.
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'