Case Styles: Convenciones de Nomenclatura en Programación
Laboratorios de infra con Docker Compose y Python

Guía del comando sort

guia comando sort

El comando sort es una herramienta para ordenar el contenido de archivos y mostrar el resultado en la salida estándar. Reordenar el contenido de un archivo numéricamente o alfabéticamente y organizar la información en orden ascendente o descendente mejora la legibilidad.

El comando sort fue implementado por primera vez en Multics. Más tarde, apareció en la Versión 1 de Unix. Esta versión fue originalmente escrita por Ken Thompson en los Laboratorios Bell de AT&T. Para la Versión 4, Thompson lo había modificado para usar tuberías, pero sort retuvo una opción para nombrar el archivo de salida porque se usaba para ordenar un archivo en su lugar. En la Versión 5, Thompson inventó «-» para representar la entrada estándar.

La versión de sort incluida en GNU coreutils fue escrita por Mike Haertel y Paul Eggert. Esta implementación emplea el algoritmo de ordenación por fusión.

Índice:

Introducción

El comando sort tiene la siguiente sintaxis:

sort [opciones] nombre_archivo

Mientras que el comando sort organiza los datos en el orden especificado, el comando grep muestra u oculta la información especificada. Mira las expresiones regulares con el comando grep.

Ejecutar el comando sort sin [opciones] muestra el contenido del archivo y aplica las reglas de ordenación predeterminadas para la configuración regional actual.

Las reglas principales son:

– Las líneas que comienzan con un número van antes de las líneas que comienzan con una letra, ordenadas en orden ascendente (1-10).
– Las líneas que comienzan con letras se ordenan en orden alfabético ascendente (A-Z).

Por ejemplo, el siguiente archivo tiene varias líneas aleatorias:

Ejemplo comando sort

Ejecutando el comando sort se organiza el contenido del archivo en el output de manera predeterminada:

Ejemplo comando sort

El ejemplo anterior muestra cómo el comando sort organiza las líneas de manera predeterminada cuando no se especifican opciones.

Opciones del comando sort

Las opciones más utilizadas se enumeran en la siguiente tabla:

Forma corta de la opción Forma larga de la opción Descripción
-b --ignore-leading-blanks Hace que sort ignore los espacios en blanco iniciales.
-d --dictionary-order Hace que sort considere solo caracteres alfanuméricos y espacios en blanco.
-f --ignore-case Ignora la regla de ordenación por defecto de mayúsculas y minúsculas, y convierte todas las letras minúsculas a mayúsculas antes de la comparación.
/ --files0-from=F Lee la entrada de los archivos especificados por nombres terminados en NUL en el archivo especificado F. Si F es -, sort lee los nombres de la entrada estándar.
-M --month-sort Ordena las líneas según los meses (Ene-Dic).
-h --human-numeric-sort Compara números legibles por humanos (por ejemplo, 2K 1G).
-n --numeric-sort Compara datos según los valores numéricos de las cadenas.
-R --random-sort Ordena los datos mediante un hash aleatorio de las claves pero agrupa las claves idénticas juntas.
/ --random-source=FILE Obtiene bytes aleatorios del archivo especificado FILE.
-r --reverse Invierte los resultados de la comparación.
/ --sort=WORD Ordena los datos según la palabra especificada WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V.
-c --check, --check=diagnose-first Verifica si la entrada ya está ordenada pero no la ordena.
/ --debug Anota la parte de la línea utilizada para ordenar.
-k --key=KEYDEF Ordena los datos usando la clave especificada KEYDEF, que da la ubicación y tipo de clave.
-m --merge Hace que sort combine archivos ya ordenados.
-o --output=FILE Redirige la salida a FILE en lugar de imprimirla en la salida estándar.
-t --field-separator=SEP Usa el separador especificado SEP en lugar de la transición de no blanco a blanco.
-z --zero-terminated Hace que sort use NUL como delimitador de línea en lugar del carácter de nueva línea.
/ --help Muestra el archivo de ayuda con la lista completa de opciones y sale.
/ --version Muestra la versión del programa y sale.

Ejemplos del comando sort

Esto es lo interesante, vamos a ver distintas posibilidades con el comando.

Ejemplo 1: Guardar la salida en un archivo

El comando sort solo muestra el contenido de un archivo después de ordenarlo, pero no cambia el archivo. Sin embargo, la opción -o te permite guardar la salida del comando sort en un archivo.

Por ejemplo, el siguiente comando ordena los datos en el archivo default.txt y guarda la salida en el archivo sorted.txt:

sort -o fichero_ordenado.txt fichero_pruebas_sort.txt

Otra forma de hacerlo es redirigiendo la salida (Gestión de la salida de datos):

sort fichero_pruebas_sort.txt > fichero_ordenado.txt

Ejemplo 2: Verificar el orden en un archivo

Especifica la opción -c para verificar si el contenido de un archivo ya está ordenado. Si está ordenado no genera ninguna salida. Sin embargo, cuando sort encuentra una línea desordenada, muestra un mensaje informando que la primera línea está fuera de lugar.

Por ejemplo:

sort -c fichero_ordenado.txt

Hemos cambiado una línea en el fichero ordenado anteriormente.

Ejemplo comando sort

Ejemplo 3: Ordenar varios archivos

Hay dos formas de ordenar varios archivos:

1. Enumera los nombres de los archivos como argumentos separados por un espacio.

Ordena varios archivos simultáneamente especificando los nombres de los archivos respectivos como argumentos, separados por espacios en blanco. Los contenidos de los archivos se unen, se ordenan e imprimen en la salida estándar.

Por ejemplo:

sort desorden1.txt desorden2.txt

El comando concatena, ordena e imprime los contenidos de ambos archivos.

2. Usa el comando find en combinación con el comando sort.

Otra forma de ordenar múltiples archivos simultáneamente es dirigir la salida del comando find al comando sort y usar la opción –files0-from= en el comando sort.

Especifica la opción -print0 en find para que los nombres de archivo terminen con el carácter NUL y garantiza que el programa lea correctamente la lista de archivos.

Por ejemplo:

find -name "desorden?.txt" -print0 | sort --files0-from=-

Ejemplo 4: Ordenar por campos

Por defecto, sort compara el contenido de toda la línea y decide cómo ordenarlo. Para comparar según un subconjunto de datos, especifica qué campos comparar usando la opción -k.

La opción -k tiene la siguiente sintaxis:

-k [ FInicio [ .CInicio ] ] [ Modificador ] [ , [ FFin [ .CFin ] ][ Modificador ] ]
  • FInicio. El inicio de la línea.
  • CInicio. La primera columna en el campo.
  • FFin. El final de la línea.
  • CFin. La última columna del campo.

La clave de ordenación incluye todos los caracteres que comienzan con el campo especificado por la variable FInicio y la columna especificada por la variable CInicio. La clave termina con el campo especificado por FFin y la columna especificada por CFin.

No especificar FFin asume el último carácter de la línea como el final. Sin especificar CFin, se asume el último carácter en el campo FFin.

Si hay algún espacio entre los campos, sort los considera como campos separados.

Por ejemplo, contando que un fichero tiene líneas con tres campos, vamos a aplicar el siguiente comando:

sort -k 2,2 sysadmin.txt

Ejemplo comando sort

El comando ordena los datos según el segundo campo e ignora el primer campo.

Por defecto, sort asume que los campos están separados por espacios en blanco. Si hay varios caracteres en blanco, sort los considera parte del campo siguiente para fines de ordenación. Especifica la opción -b para ignorar cualquier espacio en blanco inicial.

Ejemplo 5: Ordenar en orden inverso

Utiliza la opción -r para ordenar los datos en orden inverso, es decir, en orden alfabético inverso o de números más altos a más bajos.

sort -r sysadmin.txt

Ejemplo 6: Eliminar entradas duplicadas

La opción -u permite a sort eliminar entradas duplicadas de un archivo.

sort -u lineas_duplicadas.txt

Ejemplo 7: Ordenar por meses

Especifica la opción -M para organizar los datos según los meses enumerados en un archivo.

Para demostrar la ordenación por meses, crea un archivo poblado por la salida del comando ls. Luego, ordena los datos de la salida de ls -l por meses ejecutando el siguiente comando:

ls -l > orden-por-mes.txt
sort -Mk6 month-sorting.txt

Ejemplo 8: Ordenar datos aleatoriamente

Utiliza la opción -R para ordenar aleatoriamente los datos sin aplicar ningún criterio de ordenación:

sort -R sysadmin.txt

Ejemplo 9: Especificar un delimitador

sort separa los campos en una línea utilizando espacios en blanco (espacios o tabulaciones) como delimitadores de campo. Especifica la opción -t para cambiar el delimitador de campo a un carácter diferente.

Por ejemplo, el siguiente archivo contiene múltiples campos, incluyendo el nombre de una persona, el título del trabajo y el lugar de residencia:

1, Manuel, sysadmin, España
2, Simon, sysadmin, Angola
3, Mark, sysadmin, Rusia
3, Tom, sysadmin, Ecuador
4, Rachel, sysadmin, Reino Unido
5, Gene, sysadmin, Grecia
6, Russ, sysadmin, Vietnam

Ordenar el archivo por lugar de residencia sin cambiar el delimitador no funciona porque algunas ciudades tienen un espacio en medio de su nombre. El espacio hace que sort interprete el nombre del país como dos campos en lugar de uno.

Se puede cambiar el delimitador a una coma (,) para ordenar correctamente el contenido del archivo:

sort -t, -k4 sysadmin.txt

Ejemplo 10: Ordenar la salida de un flujo

Otra forma de suministrar entrada al comando sort es utilizar una tubería (|). Al dirigir la salida hacia sort, este puede ordenar la salida de otro comando y, opcionalmente, guardar los resultados en un archivo.

El siguiente ejemplo muestra cómo dirigir la salida del comando ls hacia sort y ordenar el contenido por tamaño de archivo:

«`sh
ls -l /home/$USER | sort -nk5
«`

Las opciones -nk5 especifican la ordenación numérica en el quinto campo.

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar