Subsections

Comandos básicos

Descargen los siguientes archivos :

More

more es un comando para ver archivos de texto en el terminal. Pruebe los siguientes comandos:

 more global_seismicity_feb27-apr19_2010.txt

Aquí tenemos la sismicidad global, de la red global de IRIS, para las primeras semanas después del terremoto magnitud 8.8 en Chile el 2010. Las columnas son (catálogo, día, hora (UTC),latitud, longitud, profundidad, código de la región, código de la zona sísmica, tipo de magnitud, magnitud).

Head, Tail

Si no quieres ver todas las líneas de un archivo de texto, se puede usar head o tail. Pruebe lo siguiente:

 head global_seismicity_feb27-apr19_2010.txt
tail global_seismicity_feb27-apr19_2010.txt
tail -1 global_seismicity_feb27-apr19_2010.txt

Pipes

Se puede ejecutar varios comandos en una sola línea usando un "pipe", | , para mandar la salida de la primera operación a una segunda. Cuando introducimos más comandos abajo, vamos a combinarlos usando esta técnica.

Awk

awk es una herramienta muy poderosa para manipular datos en columnas. El manual de awk es muy grande, así que aquí mostramos solo algunos ejemplos:

i)
Notar el número de la fila (NR = Number of Row):
 more esk_annual_means.txt | awk '{print NR}'

también se puede notar el número de filas en total:

 more global_seismicity_feb27-apr19_2010.txt | awk 'END {print NR}'

ii)
Notar el número de columnas en cada fila (NF = Number of Fields):
 more esk_annual_means.txt | awk '{print NF}'

iii)
Elegir solamente líneas con un cierto número de columnas:
 more esk_annual_means.txt | awk '{ if ( NF == 11 ) print $0}'
aquí $0 implica toda la línea.
iv)
Seleccionar solamente las columnas de datos que quieres:
 more global_seismicity_feb27-apr19_2010.txt | awk '{print $4, $5, $10}'
(en este caso, elegimos el latitud, longitud, y magnitud de los sismos en el catálogo, note que todavía queda un "," entre los valores, podemos sacar eso usando sed (sección 2.6)).
v)
Poner texto entre las columnas:
 more global_seismicity_feb27-apr19_2010.txt | awk '{print "latitud "$4, "longitud "$5, "magnitud "$10}'

note que dentro el awk, el "," significa un espacio. Podemos obtener el mismo resultado que arriba con:

 more global_seismicity_feb27-apr19_2010.txt | awk '{print "latitud",$4, "longitud",$5, "magnitud",$10}'

vi)
Elegir las líneas de un set de datos requeridos:
 more esk_annual_means.txt | awk '{ if ( $1 != "Year" && NF == 11 ) print $0}'
note que aquí, el condicional dentro del "if" requiere que las líneas tengan 11 columnas, y que la primera columna no se llame Year

vii)
Elegir datos solamente entre ciertos valores, por ejemplo terremotos de magnitud 5.6, 5.7, 5.8, 5.9, 6.0
 more global_seismicity_feb27-apr19_2010.txt  | awk '{if ( $10 > 5.5 && $10 <= 6.0 ) print $0}'

viii)
Hacer cálculos básicos, por ejemplo para convertir la profundidad de los terremotos (columna 6) en distancia desde el centro de la Tierra, podemos poner:
 more global_seismicity_feb27-apr19_2010.txt | awk '{print "latitud "$4, "longitud "$5, "dist" 6371 -$6}'

ix)
Otro cálculo, para imprimir el año, la declinación y la inclinación del campo magnético, con los angulos en grados decimales:
 more esk_annual_means.txt | awk '{if ( $1 != "Year" && NF == 11 ) print $1, $2 - ($3/60), $5 + ($6/60)}'
ixb)    Quizas queremos guardar este formato, con la intensidad, en otro archivo texto, que se llame esk_dec_inc_intensidad.txt
	more esk_annual_means.txt | awk '{ if ( $1 != "Year" && NF == 11 ) print $1, $2 - ($3 / 60), $5 + ($6 / 60), $10}' > esk_dec_inc_intensidad.txt
x)
Tomar el promedio de todos los valores en una columna (en este caso, tomamos el promedio de la intensidad del campo magnético (nT) en ESK para el último siglo):
 more esk_dec_inc_intensidad.txt | awk 'BEGIN{sum=0}{sum+=$4}END{print sum/NR}'

Aquí, BEGIN { } dice que en la primera fila ponga la variable sum igual a cero. En la parte siguiente { } dice que sumamos el valor en la columna cuatro línea por línea. END { } dice lo que debe hacer awk cuando llega a la última fila.

xi)  Finalmente, algo que podría servir para reformatear un bloque de datos como
0.1 0.2 0.3
0.4 0.5 0.6
0.7 0.8 0.9

en solo una columna de datos se puede usar awk. Suponiendo que el bloque de datos esta
guardado en un archivo llamado datos, se puede usar

more datos | awk '{i=1; while (i < NF+1) {print $i; ++i}}'

para obtener

0.1
0.2
0.3
0.4
etc.

Revisa que se entiende lo que hace este comando!

Grep

grep (get regular expression) es un programa que busca patrones en archivos. Solamente las líneas que contienen este patron son mostradas. Por ejemplo, para mostrar los terremotos del catalogo QED/NEIC ponemos:

 more global_seismicity_feb27-apr19_2010.txt | grep "QED/NEIC"

Usamos grep con la opción -v para buscar las líneas que no tienen el patrón, por ejemplo:

 more global_seismicity_feb27-apr19_2010.txt | grep -v "QED/NEIC"

lo que nos entrega los terremotos que no son de este catálogo.

Sed

sed (stream editor) es un programa que puede transformar texto, línea por línea. El formato general es:

 sed 's/algo/algo diferente/g'

Por ejemplo, para cambiar las comas en el archivo de los terremotos a estrellas, ponemos:

 more global_seismicity_feb27-apr19_2010.txt | sed 's/,/*/g'

Para eliminar las comas, ponemos:

 more global_seismicity_feb27-apr19_2010.txt | sed 's/,//g'

Sort

El comando sort puede ser usado para ordenar las columnas, alfabéticalmente o numéricamente. Por ejemplo para ordenar la columna 1 del archivo de sismisidad alfabéticamente tecleamos:
 more global_seismicity_feb27-apr19_2010.txt | sort -k1

Para ordenar columna 6 (profundidad) del archivo de sismicidad numéricamente tecleamos:

 more global_seismicity_feb27-apr19_2010.txt | sort -k6 -n

Para ordenar columna 6 numéricamente, y al revés:

 more global_seismicity_feb27-apr19_2010.txt | sort -k6 -n -r

Noten que -n ordena numéricamente, pero si eso no funciona prueba -g (general numeric sort) que es mas lento pero acepta mas formatos para los números, incluyendo exponenciales etc.

Combinacion de comandos, pipes

Tomar el archivo de sismicidad, elegir el catalogo FINGER/NEID, sacar las comas, ordenar las magnitudes numéricamente, elegir los datos de la última línea, es decir, los datos del mayor magnitud.
 more global_seismicity_feb27-apr19_2010.txt |grep "FINGER/NEIC" | sed 's/,//g' | sort -k10 -n | tail -1

Elegir las regiones 134 y 135 en la lista de sismicidad:

 more global_seismicity_feb27-apr19_2010.txt | grep "FINGER/NEIC" | sed 's/,//g' | awk '{if ( $7 == 134 || $7 == 135 ) print$0}'

Notar que || dentro del if ( ) significa ``o''.

Preguntas

  1. ¿ Dónde fue el terremoto más profundo en el catálogo global ?
  2. ¿ Cual es el número de réplicas en las regiones 134, 135 el día 28 feb 2010 ?
  3. ¿ Cuántos terremotos de magnitud 6.0 o mayor, en regiones 134, 135 ocurrieron entre feb 27 - apr 19 ?
  4. ¿ Por cuántos años estuvo la intensidad del campo magnético sobre 48000 nT en la estación ESK ?
  5. ¿ Cual fue el promedio de la inclinación y la declinación del campo magnético en ESK entre los años 1910 y 2010 ?

matt 2014-03-19