column - sort linux
Sort & uniq en shell de Linux (6)
¡Tener cuidado! Si bien es cierto que "sort -u" y "sort | uniq" son equivalentes, cualquier opción adicional para ordenar puede romper la equivalencia. Aquí hay un ejemplo del manual de coreutils:
Por ejemplo, ''sort -n -u'' inspecciona solo el valor de la cadena numérica inicial cuando busca la unicidad, mientras que ''sort -n | uniq ''inspecciona toda la línea.
De forma similar, si clasifica los campos clave, la prueba de unicidad utilizada por clasificación ya no necesariamente revisará toda la línea. Después de haber sido mordido por ese error en el pasado, en estos días tiendo a usar "sort | uniq" cuando escribo scripts Bash. Prefiero tener una mayor sobrecarga de E / S que correr el riesgo de que alguien más en la tienda no sepa acerca de esa trampa en particular cuando modifiquen mi código para agregar parámetros de clasificación adicionales.
¿Cuál es la diferencia entre los siguientes comandos?
sort -u FILE
sort FILE | uniq
Hay una pequeña diferencia: código de retorno.
El problema es que, a menos que shopt -o pipefail
esté configurado, el código de retorno del comando canalizado será el código de retorno del último. Y uniq
siempre devuelve cero (éxito). Intenta examinar el código de salida y verás algo como esto ( pipefail
no está establecido aquí):
pavel@lonely ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
pavel@lonely ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0
Aparte de esto, los comandos son equivalentes.
He trabajado en algunos servidores donde sort no admite la opción ''-u''. allí tenemos que usar
sort xyz | uniq
Nada, producirán el mismo resultado
Usar sort -u
hace menos E / S que sort | uniq
sort | uniq
, pero el resultado final es el mismo. En particular, si el archivo es lo suficientemente grande como para que el sort
tenga que crear archivos intermedios, existe una posibilidad decente de que los archivos intermedios sort -u
usarán un poco menos o un poco más pequeño ya que podría eliminar los duplicados a medida que ordena cada conjunto. Si los datos son altamente duplicativos, esto podría ser beneficioso; si hay pocos duplicados de hecho, no hará mucha diferencia (definitivamente un efecto de rendimiento de segundo orden, en comparación con el efecto de primer orden de la tubería).
Tenga en cuenta que hay momentos en que la tubería es apropiada. Por ejemplo:
sort FILE | uniq -c | sort -n
Esto ordena el archivo en orden de la cantidad de apariciones de cada línea en el archivo, apareciendo las líneas más repetidas al final. (No me sorprendería descubrir que esta combinación, que es idiomática para Unix o POSIX, se puede agrupar en un complejo comando de ''ordenación'' con clasificación GNU).
Hay momentos en que no usar la tubería es importante. Por ejemplo:
sort -u -o FILE FILE
Esto ordena el archivo ''in situ''; es decir, el archivo de salida está especificado por -o FILE
, y esta operación está garantizada de forma segura (el archivo se lee antes de sobrescribirse para la salida).
sort -u
será un poco más rápido, porque no necesita conectar la salida entre dos comandos
También vea mi pregunta sobre el tema: llamar a uniq y ordenar en diferentes órdenes con shell