513372 - Linux, Scripts y GMT

CLASE 3 - PRINTF, EXPRESIONES REGULARES, .BASHRC, TAR

back

3.1 printf en awk

Desde ahora, usamos awk a manipular columnas de datos. Pero a veces  la salida del comando se ve "sucia" , es decir,  las columnas no están alineadas, y con los numeros en el formato original. Más que un problema estético, algunos programas (especialmente los escritos en fortran) necesitan que el orden de datos en las columnas sea muy  específico,  porque requieren que los datos esten en sus posiciones exactas en cada línea. Por eso usamos printf (print format) en awk para modificar las columnas.

Trabajamos con el archivo  global_seismicity_feb27-apr19_2010.txt, modificamos las columnas usando awk, pero ahora en vez de usar print usamos printf.

Pruebe las siguientes sentencias :

head global_seismicity_feb27-apr19_2010.txt | awk '{print $5}'

aquí usamos awk para extraer del archivo la columna de las longitudes de los terremotos. Ahora usamos printf:

head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%10s\n", $5}'

aquí específicamos el formato de la columna, en este caso %10s significa que cada entrada en la columna tiene un espacio de 10 caracteres (character string, s) y el \n es un comando para empezar una nueva línea entre las entradas (pruebe el comando sin el \n para ver eso).

Note que si la entrada esta más grande que el espacio disponible, podemos elegir si sale toda la entrada, o solamente la primera parte:
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%7s\n", $5}'
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%7.7s\n", $5}'
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%7.6s\n", $5}'

También, podemos específicar que la entrada en la columna sea un entero (integer, i)
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%5i\n", $5}'
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%7.4i\n", $5}'

podemos específicar el número de decimales de una entrada
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%10.4f\n", $5}'
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%10.2f\n", $5}'

podemos expresar un número en forma exponencial
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%15e\n", $5}'
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%12.3e\n", $5}'

Finalmente, podemos hacer todo eso a múltiples columnas, pruebe lo siguiente:
head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%15s %11s %15s %5.1f %6.1f %10.3e %5i %5i %4s %4.1f \n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10}'

cada opción dentro del comando printf aplica a cada columna $1-$10 respectivamente.

3.2 substrings en awk

Algo que es a veces útil con datos,  es elegir solamente parte de una columna; por eso usamos substr($X,Y,Z) donde $X representa la columna X-ésima, Y representa el caracter de la columna en donde empezar, y Z representa el número de los caracteres requeridos. Eso es más fácil mostrar con ejemplos:

head global_seismicity_feb27-apr19_2010.txt | awk '{print $3, substr($3,1,2)}'
head global_seismicity_feb27-apr19_2010.txt | awk '{print $3, substr($3,1,4)}'
head global_seismicity_feb27-apr19_2010.txt | awk '{print $3, substr($3,4,2)}'
head global_seismicity_feb27-apr19_2010.txt | awk '{print $2, substr($2,9,2)}'

3.3 expresiones regulares (con ejemplos usando grep)

Expresiones regulares son una manera poderosa para clasificar partes de texto:

Para mostrar unos ejemplos, usamos el archivo southern_Chile_and_Argentina.txt

Una expresión de lo más simple es  buscar un set de carácteres (aquí uso la opción -i para buscar con mayúscula o minúscula)
more southern_Chile_and_Argentina.txt | grep -i "volcan"

para buscar solamente el inicio de un set de carácteres, use
more southern_Chile_and_Argentina.txt | grep -i "^volcan"

también se puede sustituir un . para cualquier carácter, o elegir un set de carácteres con [...]
more southern_Chile_and_Argentina.txt | grep -i "a..of"
more southern_Chile_and_Argentina.txt | grep -i "m[ae]"

Si quieres usar uno de los carácteres "especiales" (? \ . [ ] ^ $), tienes que usar un \ antes del carácter. Por ejemplo compare
more southern_Chile_and_Argentina.txt | grep -i "3.5"
more southern_Chile_and_Argentina.txt | grep -i "3\.5"

3.4 $PATH y .bashrc

En esta sección estamos modificando un archivo fundamental a la operación de un terminal. Si tienen dudas, recomiendo leer más sobre el archivo .bashrc (usando google), o pregunta en la clase.

El valor del variable PATH contiene los lugares de todos los ejecutables. Es decir, programas y scripts dentro de los directorios en la lista asociada con la variable PATH se pueden correr de cualquier ubicación en el terminal.

Para ver el valor de eso, use
echo $PATH

Nosotros queremos poner el directorio ~/bin en esta variable también. Se puede ver exactamente  cual es su ubicación en el árbol Linux.

cd ~/bin
pwd

Para cambiar la variable, podemos usar el comando

export PATH=ruta del archivo:$PATH

(por ejemplo, si mi directorio bin era /home/matt/bin yo uso el comando export PATH=/home/matt/bin:$PATH que significa que el valor de PATH esta una combinación de /home/matt/bin: y el valor anterior del PATH)

después de este comando, el valor de PATH debe cambiar. Se puede revisar de nuevo con echo $PATH; y ahora debe ser posible a correr ejecutables en su directorio ~/bin. Pruebe que reconoce el comando calday, teclee :

which calday

o simplemente corriendo el comando calday 100 2010  desde cualquier directorio.

Este cambio en PATH es temporal, pero podemos hacerlo permanentemente cambiando el archivo .bashrc que se encuentra en home (gedit es el editor de texto que usaremos en este curso)

cd
gedit .bashrc

este es una serie de comandos que se ejecutan cada vez que se abre un terminal.

Si no existe un .bashrc, baja un clón de aca y uselo:  .bashrc

Queremos poner una nueva linea al archivo, para definir el valor del PATH (export PATH=ruta del archivo:$PATH). Ahora, cuando abres un nuevo terminal, se puede correr tus propios comandos (como calday y julday) de cualquier otro directorio.

Revisa que cuando abres un terminal, la variable $PATH tiene el valor requerido, y que se pueden ejecutar los comandos del sistema, teclee :

which gedit
which awk

y también que se puede ejecutar los comandos en su propio bin, con

which calday
which julday

3.5 tarballs

tar es un programa que puede comprimir varios archivos y directorios dentro de un solo archivo (es similar al zip, o rar)

Por ejemplo, baja el archivo gmt_files.tar.gz y ponlo en  un lugar temporario.

Podemos extraer el directorio dentro con :
tar -xvzf gmt_files.tar.gz

(x=extract, v=verbose, z=zipped, f=file; sólo use el z para archivos que son zipped (.gz) también).

Debe crear un directorio, gmt_files, con todos los archivos en este curso hasta ahora.

Borre el "tarball", con rm gmt_files.tar.gz, y creelo de nuevo con

tar -cvzf gmt_files.tar.gz gmt_files/

A veces en este curso, van a encontrar un tarball, y así  es como manejarlos.
__________________________________________________________________________________________________

Estamos listos para empezar con scripts (próxima clase)


back