Usar el sort
comando probablemente será la opción más rápida.
Pero probablemente querrás arreglar la configuración regional en C.
sort -u
no informa líneas únicas, sino una de cada conjunto de líneas que las clasifican de la misma manera. En la configuración regional C, 2 líneas diferentes no necesariamente ordenan lo mismo, pero ese no es el caso en la mayoría de las configuraciones regionales basadas en UTF-8 en sistemas GNU.
Además, el uso de la configuración regional C evita la sobrecarga de tener que analizar UTF-8 y procesar órdenes de clasificación complejas, por lo que mejoraría drásticamente el rendimiento.
Asi que:
LC_ALL=C sort -u file
También puede mejorar el rendimiento utilizando una unidad más rápida (o una unidad diferente de aquella en la que se encuentran los archivos de entrada y / o salida) para los archivos temporales (usando -T
o $TMPDIR
variable de entorno), o jugando con la -S
opción admitida por algunas sort
implementaciones) .
Para algún tipo de entrada o para almacenamiento lento, el uso de la --compress-program
opción de GNU sort
(por ejemplo con lzop
) podría mejorar el rendimiento además del uso de almacenamiento.
Ahora solo una nota para aquellos que objetan (con razón hasta cierto punto) que no será el orden correcto :
Estoy de acuerdo en que, como humano, me gustaría ver a Stéphane clasificarse entre Stefan y Stephanie , pero:
- Una computadora querría que Stéphane
é
clasifique después desde (al menos cuando se expresa como U + 00E9) como un carácter o los bytes de su codificación UTF-8 después (en términos de punto de código o valor de byte). Es un orden de clasificación que es muy simple de implementar y es un orden total estricto y no tiene sorpresa.
El orden de clasificación de su localidad probablemente no sea satisfactorio en muchos casos, incluso para un humano. Por ejemplo, en mi sistema con la configuración regional predeterminada en_GB.utf8:
Stéphane y Stéphane (uno con U + 00E9, el otro con eU + 0301) no ordenan lo mismo:
$ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
Stéphane
Stéphane
pero ③, ①, ② todos ordenan lo mismo (obviamente un error en esas definiciones locales):
$ printf '%s\n' ③ ① ② | sort -u
③
Aquí, es ③, pero bien podría haber sido ① o ②
Entonces, en mi opinión, es probable que siempre desee sort -u
con LC_ALL = C, si desea líneas únicas. Y si desea que la lista resultante se ordene en el orden de clasificación del usuario, sort
vuelva a canalizarla :
LC_ALL=C sort -u | sort
LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2
/tmp
.