El shell de linux: Comando sort

sort es uno de los comandos que utilizamos mucho a la hora de realizar scripts.

Nos permite ordenar los registros o líneas de uno o más archivos.
La ordenación se puede hacer por el primer carácter, por el primer campo de la línea o por un campo distinto al primero en el caso de ficheros estructurados.

Podemos ordenar el contenido de un fichero de la siguiente manera:

sort fichero

Se realizaría la ordenación y el resultado se mostraría por pantalla. Así que, si lo que queremos es obtener el resultado de la ordenación en un fichero, haríamos:

sort fichero > ficheroordenado

Si lo que queremos es ordenar varios ficheros y añadir el resultado a otro, podemos indicar varios ficheros en la línea de entrada:

sort fichero1 fichero2 > fichero3

Y si lo que queremos es ordenar un fichero y dejar el resultado de la ordenación en el mismo fichero, podemos hacerlo con el parámetro -o (output):

sort -o f1 f1

Veamos una lista de los parámetros que pueden resultarnos más útiles a la hora de usar este comando:

  • -f : Este parámetro nos sirve para indicar que las mayúsculas y las minúsculas se van a tratar de forma diferente y que por tanto se va a seguir un ordenamiento alfabético.
  • -n : Este parámetro nos sirve para ordenar los campos numéricos por su valor numérico.
  • -r : Nos permite realizar una ordenación inversa, es decir, de mayor a menor.
  • +número : Este parámetro nos sirve para indicar la columna o campo por el que vamos hacer la ordenación. Esta sintaxis está en desuso y se va a eliminar. En su lugar se utilizará la siguiente sintaxis:
  • -k numero : De este modo especificaremos por qué columna o campo vamos a realizar la ordenación en las versiones más recientes de Linux.
  • --field-separator= separador : Normalmente, se usa como delimitador de campos el espacio en blanco. Podemos utilizar el parámetro --field-separator para indicar que vamos a usar otro delimitador de campo cualquiera. Ej: --field-separator=, La opción abreviada de --field-separator es -t.
  • -u : Nos permite suprimir todas las líneas repetidas después de realizar la ordenación.

Y algunos ejemplos con dichos parámetros:

Obtener un listado de los ficheros del directorio actual, ordenado por tamaño de archivo:

ls -l | sort +4n

Obtener un listado de los ficheros del directorio actual, ordenado de mayor a menor por tamaño de archivo:

ls -l | sort -r +4n

Obtener un listado de los ficheros del directorio actual, ordenado por nombre del archivo:

ls -l | sort +7

Ordenar un fichero eliminando las líneas repetidas:

sort -u fichero

Ordenar un fichero en el que los campos están separados por comas, por el campo número 3:

sort -t, +3

Veamos un ejemplo en el que ordenemos usando la sintaxis actual para ordenar por columnas: Imaginemos que queremos ver un listado de usuarios del fichero /etc/passwd ordenado por uid:

cat /etc/passwd| sort -t":" -k3n

Con -k3 le indicamos a sort que queremos ordenar por la columna 3. Y, al añadir la opción -n le indicamos que ordene por orden numérico.

Y si quisiéramos realizar la ordenación de mayor a menor:

cat /etc/passwd| sort -t":" -k3nr

Un ejemplo que uso mucho, cuando quiero eliminar las líneas repetidas de un archivo y dejar el contenido en el mismo archivo:

sort -o fichero -u fichero
This Article Has 36 Comments
  1. Anónimo Reply

    está bien, útil, aunque falta por ejemplo el sort -k 1, sort -t

  2. Esteban M. Navas Reply

    Hombre, tampoco pretendía hacer un análisis muy detallado del comando. Y, por poner, se podían poner muchas cosas. El -k se me pasó ponerlo porque sí lo uso bastante. En cuanto a -t es lo mismo que –field-separator. Pero no sé por qué, tengo costumbre de usar –field-separator.
    Si quieres, puedes ampliar el artículo con un comentario.

  3. Maria Teresa Reply

    me gustaria saber cual es el comando para que los ficheros salgan solo con el nombre y tamaño gracias

  4. Esteban M. Navas Reply

    Hola, María Teresa:
    ¿Qué es lo que quieres hacer? ¿Filtrar la salida de ls para obtener un listado de ficheros y sus tamaños?

  5. Anónimo Reply

    Hola tengo el siguiente problema:

    Tengo un fichero con 3 campos, donde el tercero son numero de telefono.

    nombre:apellidos:telefono

    usando el comando sort quiero que me muestre solo los que el telefono empieza por 91

    muchas gracias

  6. Esteban M. Navas Reply

    Podrías ejecutar el comando sort y filtrar con grep:

    sort -t»:» -k3 fichero | grep «91»

  7. Anónimo Reply

    quiero ordenar un fichero de mayor a menor nose como hacerlo 🙁

  8. Esteban M. Navas Reply

    Utiliza el parámetro -r para ordenar de modo inverso.

  9. Anónimo Reply

    Tengo que ordenar los numero de un fichero pero no estan por columnas si no que estan todos en una fila
    Seria algo asi:
    10 40 30 50 80

    Tengo que sacar el mayor y decir en que posicion esta

    Alguna ayuda??
    asias de ante mano

  10. Esteban M. Navas Reply

    Podrías hacer un pequeño script. Te pongo un ejemplo:

    #!/bin/bash
    FICHERO=numeros.txt
    i=1
    MAYOR=0
    for NUMERO in `cat $FICHERO`; do
    if [ $NUMERO -gt $MAYOR ]; then
    MAYOR=$NUMERO
    POSICION=$i
    fi
    ((i=i+1))
    done
    echo "Número: " $MAYOR
    echo "Posición " $POSICION

    En la variable FICHERO pondrías el nombre del fichero donde se encuentran los números.

  11. Anónimo Reply

    como le agO Para que me muestre el nombre de usuario y el id. y Ordenarlo primero por usuario y despues por el identificador de grupo.
    si tengo algo así
    usuario:passwd:id:grupo:desc..

  12. Manuel Reply

    esteban como hago para ordenarlo de menor a mayor

  13. Esteban M. Navas Reply

    Hola, Manuel. De menor a mayor es como se realiza la ordenación por defecto. No tienes que especificar nada.

  14. Anónimo Reply

    tengo un fichero como este:

    servidor:/var/www/carlos# cat listado_equipos.txt
    00:22:15:79:49:52,a0c11-pro,172.17.170.31
    00:22:15:79:34:04,a0c3-pro,172.17.170.32
    00:22:15:79:35:04,a0c4-pro,172.17.170.33
    00:22:15:63:de:10,a1a2-pro,172.17.170.34
    00:22:15:48:c6:8c,a1a4-pro,172.17.170.35
    00:22:15:63:dd:dc,a1b10-pro,172.17.170.36
    00:22:15:63:c7:95,a1b4-pro,172.17.170.37
    00:22:15:63:c8:e3,a1b5-pro,172.17.170.38
    00:22:15:63:d4:71,a1b6-pro,172.17.170.39
    00:22:15:63:c8:22,a1b7-pro,172.17.170.40
    00:22:15:48:c6:4b,a1b8-pro,172.17.170.41
    00:22:15:63:c7:d5,a1b9-pro,172.17.170.42
    00:22:15:81:7a:8c,a1c1-pro,172.17.170.43
    00:22:15:79:4b:70,a1c2-pro,172.17.170.44
    00:22:15:63:dc:ba,a1c3-pro,172.17.170.45
    00:22:15:63:dc:9e,a1c4-pro,172.17.170.46
    00:22:15:81:83:a0,a2a1-pro,172.17.170.47
    00:22:15:79:49:64,a2a2-pro,172.17.170.48
    00:22:15:60:19:4e,a2a4-pro,172.17.170.49
    00:22:15:63:dd:a5,a2a5-pro,172.17.170.50
    00:22:15:06:7e:c5,a2b4-pro,172.17.170.51
    00:22:15:91:83:fd,a2b7-pro,172.17.170.52
    00:22:15:63:dc:ae,a2b8-pro,172.17.170.53
    00:22:15:06:7e:df,a2b9-pro,172.17.170.54
    00:22:15:06:7e:db,a2c1-pro,172.17.170.55
    00:22:15:63:de:11,a2c2-pro,172.17.170.56
    00:22:15:63:dc:07,a2c3-pro,172.17.170.57
    00:22:15:81:84:71,a2c4-pro,172.17.170.58
    00:09:6b:b1:b8:3f,lenix-carlos,172.17.170.100
    00:09:6b:b1:50:55,lenix-pruebas,172.17.170.101
    00:03:47:c2:88:ce,asalapro3,172.17.170.102
    00:48:54:3A:DF:AA,ad11-pro,172.17.170.103
    00:09:6b:b1:50:95,aula-musica,172.17.170.104
    00:09:6b:b1:52:8b,aula-musica2,172.17.170.105

    como lo ordeno por ip??

  15. Esteban M. Navas Reply

    Viendo los datos que contiene el fichero y que todas las ips tienen en común 172.17.170, yo optaría por ordenarlo de la siguiente manera:

    sort -t. -k4n listado_equipos.txt

  16. Anónimo Reply

    anonimo dijo:
    Tengo un fichero con 3 campos, donde el tercero son numero de telefono.

    nombre:apellidos:telefono

    rta:
    sort -t":" -k3 fichero | grep "^91"

    ^91 significa comienza con 91

  17. Paola Reply

    Buenos días necesito mirar las fechas de un archivo y saber cual es la fecha menor y la fecha mayor.
    Como podría hacerlo?
    Muchas gracias!

  18. Paola Reply

    Buenos días necesito mirar las fechas de un archivo y saber cual es la fecha menor y la fecha mayor.
    Como podría hacerlo?
    Muchas gracias

  19. Paola Reply

    Buenos días necesito mirar las fechas de un archivo y saber cual es la fecha menor y la fecha mayor.
    Como podría hacerlo?
    Muchas gracias

  20. Esteban M. Navas Martín Reply

    Hola, Paola:
    No sé qué es lo que necesitas hacer exactamente, pero para consultar las fechas de creación, acceso, modificación o cambio, puedes usar el comando stat. Por ejemplo:

    # stat nombrearchivo

  21. Paola Reply

    Dentro de un archivo se encuentran varias fechas necesito que mire las fechas que estén y me diga cual es la fecha menor y la fecha mayor.

  22. Esteban M. Navas Martín Reply

    Imagino que el archivo tendrá en cada línea diferentes campos, entre ellos la fecha. Si es así, en principio, tan sólo tendrías que identificar qué campo es el de la fecha, ordenar el archivo por dicho campo y filtrar la salida para extraer la primera línea con head -1 y la última con tail -1

  23. Anónimo Reply

    Buenos Días, necesito que me digan como creo un script que muestre los nombres que comiencen por la letra A y su numero telefónico que comience por 875!!!, si no es mucha molestia, gracias anticipadas…

  24. Anónimo Reply

    Buenas noches, como puedo filtrar lineas de un archivo por un rango de fechas especificados en un campo

  25. Anónimo Reply

    Buenas noches, como puedo filtrar lineas de un archivo por un rango de fechas especificados en un campo

  26. Anónimo Reply

    Buenas noches, como puedo filtrar lineas de un archivo por un rango de fechas especificados en un campo

  27. victor Reply

    Buenas noches, como puedo filtrar lineas de un archivo por un rango de fechas especificados en un campo

  28. Anónimo Reply

    como hago para hacer un reporte de usuarios ordenado por su espacio utilizado en disco?

  29. Anónimo Reply

    como se hace un reporte por usuarios ordenado por su espacio utilizado en disco.

  30. Esteban M. Navas Martín Reply

    Veo que hay muchas preguntas en este post sobre cómo hacer cosas concretas.

    Para obtener el resultado que queráis, tan sólo tenéis que combinar los comandos del sistema e ir comprobando que váis obteniendo lo que queréis. Es como ir construyendo un puzzle en el que combinamos las piezas.

  31. JoJoGraMo Reply

    hola viejo, mi pregunta puede resultar algo fuera de lo comun pero no pierdo nada con hacerla:

    Es la siguiente como hago para hacer un scrip con los comandos necesarios para escanear un disco y en el comparar todos los archivos por tamaño, nombre y fecha de modificacion y eliminar los que coinsidan. es para organizar la data de un disco de respaldos.

    Saludos y gracias de antemano

  32. Esteban M. Navas Martín Reply

    Hola, JoJoGraMo:

    Hacer un script es como resolver un problema de matemáticas:
    Primero, analiza lo que te piden y extrae los datos que necesitas, luego piensa en las operaciones que tienes que hacer y, por último, qué comandos puedes usar para combinarlos de tal manera que el resultado sea lo que tú quieras.

    Para empezar, tendrías qué ver qué significa escanear el disco y con qué comandos puedes realizar dicho escaneo para obtener los datos que necesitas.

    Una vez que lo tengas claro, estudia cómo filtrar el conjunto de datos que te ofrecen los comandos para quedarte tan sólo con la parte que te interesa y tendrás tu script.

    Un saludo,

    Esteban M.

  33. Anónimo Reply

    Hola Esteban, una consulta, cómo puedo contar los campos fecha de un archivo de texto.
    file.txt (nombre;apellido;fecha)

    Ejemplo de salida:
    $5 20/05/2014
    $10 21/05/2014
    $12 22/05/2014
    Gracias.

  34. Anónimo Reply

    Hola Esteban, una consulta, cómo puedo contar los campos fecha de un archivo de texto.
    file.txt (nombre;apellido;fecha)

    Ejemplo de salida:
    $5 20/05/2014
    $10 21/05/2014
    $12 22/05/2014
    Gracias.

  35. Anónimo Reply

    Y para comparar??
    o sea sort -u file 1 file 2 > file 3
    Pero file 3 – file 4 = file 5
    gracias

  36. cesar aponte Reply

    tengo una archivo así:
    aaaa bbb cccc aaa bbbb ccc dddd aaaaa bbb cccc ddd eeee aaa dddd aaa aaa bbb ccc

    y así sucesivamente lo que desea es que cada vez que encuentre un parámetro es decir la "aaa" haga un salto de linea algo así

    aaaa bbb cccc
    aaa bbbb ccc dddd
    aaaaa bbb cccc ddd eeee
    aaa dddd
    aaa
    aa bbb ccc

    me podrían colaborar gracias.

Por favor acceder para comentar.