El shell de linux: Comando sort | Algo de Linux

lunes, 3 de marzo de 2008

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 pen 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

36 comentarios:

Anónimo dijo...

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

Esteban M. Navas dijo...

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.

Maria Teresa dijo...

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

Esteban M. Navas dijo...

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?

Anónimo dijo...

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

Esteban M. Navas dijo...

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

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

Anónimo dijo...

quiero ordenar un fichero de mayor a menor nose como hacerlo :(

Esteban M. Navas dijo...

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

Anónimo dijo...

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

Esteban M. Navas dijo...

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.

Anónimo dijo...

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..

Manuel dijo...

esteban como hago para ordenarlo de menor a mayor

Esteban M. Navas dijo...

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

Anónimo dijo...

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??

Esteban M. Navas dijo...

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

awtt dijo...

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

Paola dijo...

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!

Paola dijo...

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

Paola dijo...

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

Esteban M. Navas Martín dijo...

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

Paola dijo...

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.

Esteban M. Navas Martín dijo...

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

Anónimo dijo...

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...

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

victor dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Esteban M. Navas Martín dijo...

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.

JoJoGraMo dijo...

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

Esteban M. Navas Martín dijo...

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.

Anónimo dijo...

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.

Anónimo dijo...

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.

Anónimo dijo...

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

cesar aponte dijo...

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.