513372 - Linux, Scripts y GMT

CLASE 2 - COMANDOS BÁSICOS

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, Tail

Si 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.txt
tail global_seismicity_feb27-apr19_2010.txt
tail -1 global_seismicity_feb27-apr19_2010.txt

¿Qué hace el "-1" en el último ejemplo?

2.3 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..

2.4 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, "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.txt

ix) 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 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 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 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'

2.7 Sort

El 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, 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}'
(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?