Puede usar el comando sort
con la opción --unique
:
sort -u input-file
Si desea escribir el resultado en ARCHIVO en lugar de la salida estándar, use la opción --output=FILE
:
sort -u input-file -o output-file
El comando uniq
también podría aplicarse. En este caso, las líneas idénticas deben ser consecuentes, por lo que la entrada debe clasificarse de forma preliminar, gracias a @RonJohn por esta nota:
sort input-file | uniq > output-file
Me gusta el sort
comando para casos similares, debido a su simplicidad, pero si trabaja con matrices grandes, el awk
enfoque de la respuesta de John1024 podría ser más poderoso. Aquí hay una comparación de tiempo entre los enfoques mencionados, aplicada en un archivo (basado en el ejemplo anterior) con casi 5 millones de líneas:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
Otra diferencia significativa es la mencionada por @Ruslan :
sort -u
solo imprimirá el resultado una vez que la entrada haya finalizado, mientras que este awk
comando imprimirá cada nueva línea de resultado sobre la marcha (esto puede ser más importante para la entrada canalizada que el archivo).
Aquí hay una ilustración:
En el ejemplo anterior, el bucle (que se muestra a continuación) genera 500 combinaciones aleatorias, cada una con una longitud de tres caracteres, de las letras AD. Estas combinaciones se canalizan al awk
o sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Si desea mantener las líneas de salida en el mismo orden que las líneas de entrada, use:
Cómo funciona:
Esto usa una matriz asociativa
a
para contar la cantidad de veces que cada línea se ha visto previamente. Si no se ha visto previamente, la línea se imprime.fuente
awk
, perosort -u
es la forma fácil.sort -u
también es la forma más lenta :) He actualizado mi respuesta con una comparación de tiempo entre los dos enfoques.sort -u
solo imprimirá el resultado una vez que la entrada haya finalizado, mientras que esteawk
comando imprimirá cada nueva línea de resultado sobre la marcha (esto puede ser más importante para la entrada canalizada que el archivo).awk
solución es muy buena, aunque no tan fácil de leer comosort
.Puede usar GNU
datamash
aquí también de la siguiente manera, y mantendrá el orden de las líneas.fuente
time
comparación, esta es la solución más rápida, proporcionada aquí.