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.txtUna
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 $PATHNosotros
queremos poner el directorio ~/bin en esta variable también. Se puede
ver exactamente cual es su ubicación en el árbol Linux.
cd ~/binpwdPara 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 caldayo 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)
cdgedit .bashrceste
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