require(".zlconfig.php"); require("$webroot/cabecera.php"); ?> $navIdx->Asignar("texto_indice.php","Índice"); $navIzq->Asignar("texto_cap12.php","Capítulo 12"); $navDer->Asignar("texto_cap14.php","Capítulo 14") ?>
$graf_titulo = "$base_grafs/docs_head.png"; ?> require("$webroot/titulos.php"); ?>13. Reorganización de ficheros con cut y paste.
Hasta ahora todas las utilidades que hemos visto y otras en general tratan los ficheros en forma de líneas. Es necesario, en muchos casos extraer de documentos en forma vertical.
Se utiliza para seleccionar las columnas o campos de cada línea de un fichero.
Hay dos formas de utilización:
cut -clista [ficheros] | ||
-clista | Procesa las columnas indicadas por la lista que puede darse en formas como 1-3 (columnas de la 1 a la 3). No deben dejarse espacios al teclear la opción. |
cut -flista [-dc] [-s] [ficheros] | ||
-flista | Procesa los campos indicados por lista donde un campo viene separado por tabuladores. No deben dejarse espacios al teclear la opción. | |
-dc | Hace que la separación de campos sea un carácter c específico (si es un carácter especial debe ponerse entrecomillado). | |
-s | Suprime aquellas líneas que no tienen delimitador de campo. Todas esas líneas se procesarán sin cambios. |
Respecto a las listas, indicar que no deben contener espacios y que un rango puede darse con un guión (la combinación -5 es la misma que 1-5 y 3- es desde el campo 3 hasta el final). Pueden hacerse varios cortes a la vez.
EJEMPLOS.
El fichero tasas.lis guarda la información en forma plana, esto es, cada línea tiene los mismos caracteres (en este caso 139 caracteres por línea). Para operar con el fichero hay que conocer en qué columnas se encuentran los campos definidos.
Así, por ejemplo si se sabe que los nombres de los alumnos se encuentran entre las columnas 29 y 68, podríamos extraer el nombre completo de todos aquellos alumnos cuyo primer apellido sea PEREZ. Así
$ cut -c29-68 tasas.lis | sed -n '/^PEREZ/s/ *$//gp'
PEREZ OME/ACA MARIA FELICIDAD
PEREZ LOPEZ MARIA JOSE
donde la inclusión del último comando sed hace que también se quiten los espacios en blanco finales (si no nos importara que aparecieran podríamos sustituir el comando sed por el comando grep).
Si quisiéramos extraer del fichero títulos.lis sólo los campos de expediente y nombre de alumno haríamos
$ cut -f2,8 titulos.lis > out.lis
Por otra parte, podría interesarnos saber para cada usuario del sistema qué directorio de trabajo utiliza por defecto. Como el fichero passwd.lis tiene los campos delimitados por el carácter ':' haremos (aquí el carácter '^I' es el tabulador)
$ cut -d':' -f1,6 passwd.lis | sed -n 's/:/^I/gp' > out.lis
Hemos querido que el fichero final tenga ambos campos separados por tabuladores por lo que hemos unido todo al comando sed ya que el comando cut conserva el separador de campos :.
Se usa para fusionar líneas de ficheros diferentes o encadenar líneas sucesivas en un mismo fichero. El proceso (fusión paralela) es el siguiente: toma una lista de ficheros de entrada como argumentos, fusiona las líneas corespondientes de cada fichero y envía el resultado a la salida estándar. Las líneas de entrada se fusionan con el carácter tabulador por defecto, aunque esto puede cambiarse.
paste [-s] [-dlist] file1 ... | ||
-s | Combina en serie las líneas de un fichero para dejarlas como una única línea. Si se especifican varios ficheros de entrada, el resultado será confuso. | |
-dlist | Especifica una lista de caracteres que servirán para separar los campos de la unión. | |
- | Si se indica como uno de los ficheros, se refiere a la entrada estándar, que puede ser precisamente la salida de un filtro anterior. |
Hay que hacer notar que si uno de los ficheros de fusión tiene menos líneas que otro, se incluirá sólo el carácter de separación.
EJEMPLOS.
Básicamente la orden paste se utiliza en combinación con cut para extraer de un fichero plano campos concretos (aunque también puede utilizarse de otras maneras). Por ejemplo, si supiéramos que en el fichero tasas.lis las columnas 29 a 68 contienen los nombres de los alumnos y las 82 a 88 el NIP del alumno, podríamos extraer dichas columnas con cut y unirlas con paste con los pasos siguientes:
$ cut -c29-68 tasas.lis > nombre.lis
$ cut -c82-88 tasas.lis > nip.lis
$ paste nombre.lis nip.lis | grep -v ZARAGOZA | \
> grep -v "^ " > nombre_nip.lis
$ rm nombre.lis nip.lis
Observar que este ejemplo, aunque complicado, es la única salida al problema.
require("$webroot/pie.php") ?>