Asignar("texto_indice.php","Índice"); $navIzq->Asignar("texto_cap7.php","Capítulo 7"); $navDer->Asignar("texto_cap9.php","Capítulo 9") ?>

8. Ordenación avanzada con sort.

El comando sort puede utilizarse para clasificar y fusionar ficheros de texto.

sort [opciones] [fichero/s]

Este comando tiene numerosas opciones que pueden clasificarse en tres grupos que veremos a continuación.

Alteran el comportamiento de sort

  -m Fusiona dos ficheros que se suponen clasificados.
  -o salida Envía la salida al fichero salida.
  -u Suprime todas las líneas con idéntica clave de clasificación menos una (por defecto se suprimirán todas las líneas iguales a no ser que se especifique otra clave de clasificación).
  -ykmem Fija en kmem la cantidad inicial de memoria principal reservada para almacenamiento.
  -zn Supone que n es el tamaño de registro más largo.

Especifican el tipo de orden.

  -c Comprueba que la entrada ya está clasificada.
  -d Utiliza la orden de diccionario, esto es, en las comparaciones únicamente son significativos las letras, dígitos y blancos (espacios y tabuladores).
  -f Equipara letras mayúsculas y minúsculas.
  -i Ignora los caracteres que estén fuera del rango ocatl 040 y 0176 ASCII en comparaciones no numéricas.
  -M Compara como meses en inglés (de esta forma January es JAN que va antes de FEB y los campos que no son meses se tratan como si precedieran a JAN).
  -n Ordena numéricamente (los espacios en blanco anteriores al número son ignorados) aunque no ordena correctamente las formas exponenciales.
  -r Invierte el orden.

Especifican una clave de clasificación restringida.

  -b Ignora los espacios en blanco iniciales cuando determinan el principio y el final de una clave de clasificación (esto suele ocurrir cuando los números tienen espacios iniciales en el campo para que queden en columnas).
  +pos1
[-pos2]
Empieza la comparación en el campo pos1 y terminarla en el campo pos2 (si pos2 no aparece sigue hasta el final). Así +2 significa saltar dos campos y +2 -3 significa saltar dos campos y clasificar hasta el tercer campo (esto es, ordenar sólo por el tercer campo).
  +m,n Significa que hay que empezar en el carácter n+1 del campo m+1 (el separador de campo se incluye en el contador de caracteres). Así +3,2 significa saltar tres campos y dos caracteres.
  -m,n Significa que hay que continuar hasta el n-ésimo carácter que sigue al campo m-ésimo (el separador de campo se incluye en el contador de caracteres).
  -tc Emplea el carácter c como separador de campos. Si éste puede tener un significado especial para el shell es conveniente entrecomillarlo. Si no se indica esta opción, los caracteres para separar campos son el tabulador y el carácter de espacio.

Todos estos parámetros pueden incluirse juntos. Como ejemplo, la orden

$ sort +2nr -3 +7fd titulos.lis

significa que hay que clasificar el campo tercero (salta dos campos y se para en el tercero, esto es, ordena el tercero) en orden numérico inverso y a la vez el campo octavo hasta el final en el orden del diccionario considerando iguales las mayúsculas y minúsculas (para aquellos segundos campos iguales).

EJEMPLOS.

Podría interesarnos saber si en el listado de titulados por plan hay algún alumno que tiene más de un título (es decir, dos expedientes para un mismo NIP). Para ello podríamos hacer una mezcla sort y uniq (y algo más)

$ sort +2 titulos.lis | uniq -2 -c | awk '$1 <= 2 {print}' < out.lis

Ahora queremos saber cuántos usuarios utilizan por defecto los distintos programas de arranque. Sabemos que estos datos están en el fichero /etc/passwd (que hemos puesto en passwd.lis modificado). Sin embargo hay varios problemas debido a la propia forma del propio fichero /etc/passwd.

Una forma de hacerlo sería como sigue

$ sort -t':' +6 passwd.lis | sed -n -e "s/ //g" -e "s/:/^I-/gp" | \
> uniq -6 -c | awk '{print $1, $8} | sed 's/-//g'
5 /bin/csh
47 /bin/ksh
4 /bin/sh
1 /etc/shutdown
1 /usr/lib/uucp/uucico

Aquí, como antes, hemos hecho uso del programa awk. Obviamente esto podría hacerse con una combinación adecuada de utilidades como grep y el programa wc conociendo los shells que existen en el sistema, pero se nos habrían escapado otros programas de arranque del usuario (como es el caso de /etc/shutdown o de /usr/lib/uucp/uucico).