En esta
clase, trabajaremos en los siguientes archivos de datos:
global_seismicity_feb27-apr19_2010.txt
esk_annual_means.txt
2.1 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, del red global de IRIS, para las
primeras semanas después del terremoto magnitud 8.8 en Chile el 2010.
Las columnas son {catalogo, día, hora (UTC),latitud, longitud, profundidad,
código de la región, código de la zona sísmica, tipo de magnitud, magnitud}.
more esk_annual_means.txt-Aquí
tenemos mediciones del campo magnético en la estación ESKDALEMUIR del
último siglo. Las columnas son {año, declinación (grados), declinación
(minutos), intensidad horizontal en nT, inclinación (grados),
inclinación (minutos), componente x en nT, componente y en nT,
componente Z en nT, intensidad total en nT}. (
look here)
2.2 Head, TailSi no quieres ver todas las lineas de un archivo de texto, se puede usar
head o
tail. Pruebe los siguientes:
head global_seismicity_feb27-apr19_2010.txttail global_seismicity_feb27-apr19_2010.txt
tail -1 global_seismicity_feb27-apr19_2010.txt¿Qué hace el "-1" en el último ejemplo?
2.3 PipesSe
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..
2.4 Awkawk
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, "distancia del centro de la Tierra (km) "6371 - $6}'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)}'ix) quizas queremos guardar este formato 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.txtix) 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. El parte siguiente {} dice que sumamos el valor en columna
cuatro línea por línea. END{} dice lo que debe hacer awk cuando
llega a
la última fila.
2.5 Grepgrep
(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 lineas 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 catalogo.
2.6 Sedsed (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'2.7 SortEl comando
sort puede ser usado para ordenar las columnas, alfabéticalmente o numéricamente
Por ejemplo, para ordenar columna 1 del archivo de sismicidad 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 en revés, tecleamos,
more global_seismicity_feb27-apr19_2010.txt | sort -k6 -n -r
2.8 Combinaciones de comandos, pipesTomar
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 -1Elegir 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}'(note el || dentro del
if ( ) significa o)
Encontrar el numero de replicas en regiones 134, 135 el día 28 feb 2010
more global_seismicity_feb27-apr19_2010.txt | grep "FINGER/NEIC" | sed 's/,//g' | awk '{if ( $7 == 134 || $7 == 135 ) print $0}' | grep "2010/02/28" | awk 'END {print NR}'2.9 Preguntas¿Dónde fue el terremoto más profundo en el catálogo global?
¿Cuántos terremotos de magnitud 6.0 o mayor, en regiones 134, 135 ocurrieron el feb 27- apr 19?
¿Por cuántos años estuvo la intensidad del campo magnético sobre 48000 nT en la estación ESK?
¿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?