Subsections

Printf, expresiones regulares, tar, bashrc

Printf en awk

Desde ahora, usamos awk para manipular columnas de datos. A veces la salida del comando se ve "sucia" , es decir, las columnas no están alineadas, y con los números en el formato original. Más que un problema estético, algunos programas (especialmente los escritos en fortran) necesitan que el orden de los 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.
Trabajaremos 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í especificamos 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 $ \backslash$n es un comando para empezar una nueva línea entre las entradas (pruebe el comando sin el $ \backslash$n para ver eso).

Notar que si la entrada es 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 especificar que la entrada en 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 especificar 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}'

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 esto a múltiples columnas, pruebe lo siguiente:

 head global_seismicity_feb27-apr19_2010.txt | awk '{printf "%15e\ %5.1f\n", $5, $2}'

Cada opción dentro del printf se aplica a las culumnas 2 y 5 respectivamente.

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 de 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 $2, substr($2,9,2)}'

Expresiones regulares

Expresiones regulares son una manera poderosa para clasificar partes de texto. Para mostrar algunos ejemplos usamos el archivo southern_Chile_and_Argentina.txt
Una expresión de lo más simple es buscar un set de caracteres (aquí uso la opción -i para buscar con mayúscula o minúscula)
 more southern_Chile_and_Argentina.txt | grep -i "volcan"

También se puede sustituir un . para cualquier caracter, o elegir un set de caracteres 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 caracteres especiales ? . [ ] $ \wedge$ $ tienes que usar un $ \backslash$ antes del caracter. Por ejemplo, compare:

 more southern_Chile_and_Argentina.txt | grep -i "3.5"
more southern_Chile_and_Argentina.txt | grep -i "3\.5"

$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 desde cualquier ubicación en el terminal. Para ver el valor de eso, use:
 echo $PATH

Nosotros queremos poner el directorio $ \sim$/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 $ \slash$home$ \slash$matt$ \slash$bin yo uso el comando export PATH=$ \slash$home$ \slash$matt$ \slash$bin:$PATH que significa que el valor de PATH esta compuesto de /home/matt/bin: y el valor anterior del PATH.
Después de este comando, el valor del PATH debe cambiar. Se puede revisar con echo $PATH; y ahora debe ser posible correr ejecutables en su directorio $ \sim\slash$bin. Pruebe que reconoce el comando calday, teclee:

 which calday

o simplemente corriendo calday 100 2010 desde cualquier directorio.
Este cambio en el PATH es temporal, pero podemos hacerlo permanentemente modificando el archivo .bashrc que se encuentra en $HOME. Este archivo consiste en una serie de comandos que se ejecutan cada vez que se inicia el terminal.

 cd
gedit .bashrc

Si no existe un .bashrc, baja un clón de aca y uselo: (creo que todos los maquinas deberian tener uno ahora, entonces no hay enlace!)
Vamos a poner una nueva línea al archivo para definir el valor del PATH (export PATH=ruta del archivo:$PATH). Ahora, cuando abres un nuevo terminal, se pueden correr tus propios comandos (como calday y julday) desde cualquier otro directorio.

Nota:
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 que también se pueden ejecutar los comandos que están en tu directorio bin:
 which calday
which julday

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 temporal.
Podemos extraer el directorio con :
 tar -xvzf gmt_files.tar.gz

en donde,

(Solo use z para archivos que son zipped (.gz) también).

Preguntas

  1. ¿ Cual sería la sintáxis para comprimir los archivos file1, file2, file3 en un archivo files.tar.gz ?
  2. ¿ Cual es el comando para listar los archivos o directorios contenidos en un archivo tar.gz sin que este sea descomprimido ?

matt 2014-03-19