Datos Estructurados AWK

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 26

Biología Computacional

Programación Para las Ciencias Biológicas

Datos estructurados con BASH y AWK


Basado en el manual “El Lenguaje de Programación AWK/GAWK”, Jesús Alberto Vidal Cortés, 2002

Charles Escobar
Ciclo de vida de la minería de
datos con el modelo CRISP-DM.
Fases principales en el ciclo de vida de la minería
de datos y la dirección a seguir se muestra con
flechas. Este modelo no es una imposición rígida,
sino más bien un marco para garantizar que está
en el camino correcto al pasar por el ciclo de vida
de cualquier proyecto de análisis.

En algunos escenarios como la detección de


anomalías o el análisis de tendencias, es posible
que esté más interesado en la comprensión,
exploración y visualización de datos que en el
modelado intensivo.

Figure 1-22. The CRISP-DM model depicting the data mining lifecycle
Practical Machine Learning with Python
Dipanjan Sarkar/Raghav Bali/Tushar Sharma
Datos estructurados con BASH y AWK
AWK

awk es equivalente a una navaja del ejercito suizo,


que es útil para modificar archivos, buscar y
transformar bases de datos, generar informes
simples y otras muchas cosas.

Awk está especialmente diseñado para trabajar


con archivos estructurados y patrones de texto.
Dispone de características internas para
descomponer líneas de entrada en campos y
comparar estos campos con patrones que se awk '{ sum += $1 }; END { print sum }' file
especifiquen. awk -F: '{ print $1 }' /etc/passwd
AWK

El nombre de awk se debe a las iniciales de sus


diseñadores: Alfred V. W. A ho, Peter J. Weinberger
y Brian Kernighan. La versión original de awk fue
escrita en 1977 en los Laboratorios de AT&T. En
1985 una nueva versión hizo al lenguaje de
programación más potente, introduciendo
funciones definidas por el usuario, múltiples
streams de entrada y evaluación de expresiones
regulares.
AWK

La implementación GNU, gawk, fue escrita en 1986


por Paul Rubin y Jay Fenlason , con consejos de
Richard Stallman. John Woods también contribuyó
con parte del código. En 1988 y 1999, David
Trueman, con ayuda de Arnold Robbins, trabajaron
duramente para hacer a gawk compatible con el
nuevo awk.
INVOCACIÓN DE AWK

awk [-Ffs] [-v var=valor] [-V] [-C] [-c] [-a] [-e] [--] 'program' fichero…

awk [-Ffs] -f fichero-fuente [-f fichero-fuente ...] [-v var=valor] [-V] [-C] [-c] [-a] [-e] [--] fichero...
INVOCACIÓN DE AWK
-Ffs Fija la variable FS al valor fs
-f source-file Indica que el program awk se encuentra en el fichero-fuente en lugar de en
el primer argumento que no es opción.
-v var=valor Le asigna a la variable var el valor valor antes de que comience la
ejecución del programa. Dichos valores de variables están disponibles
dentro de la regla BEGIN
La opción ‘-v’ solo puede fijar el valor de una variable, pero se pueden
especificar tantas variables como se deseen mediante el uso repetido de
esta opción: `-v foo=1 -v bar=2'.
-a Especifica el uso de la sintáxis de awk tradicional para las expresiones
regulares. Esto significa que ‘\’ puede ser usado para quote cualquier
expresión regular dentro de corchetes, tal y como sería fuera de ellos. Este
modo es actualmente el modo por defecto. Ver la sección Operadores
de Expresiones Regulares .
INVOCACIÓN DE AWK
-e Especifica el uso de la sintáxis de egrep para las expresiones regulares. Esto significa que ‘\’
no sirve como un carácter de quoting dentro de los corchetes; técnicas ideosincráticas son
necesarias para incluir varios caracteres especiales dentro de ellas. Este modo podría
convertirse en el modo por defecto en el futuro.
-c Especifica modo compatibilidad, en el cuál las extensiones GNU en gawk son deshabilitadas,
de forma que gawk se comporta como el awk de Unix.
-V Muestra información de la versión para nuestra copia particular de gawk. De esta forma
puedes determinar si tu copia de gawk está actualizada con respecto a la que está
distribuyendo actualmente la Fundación de Software Gratuito. Esta opción podría desaparecer
en una versión futura de gawk.
-C Muestra la versión corta de la Licencia Pública General. Esta opción podría desaparecer en
futuras versiones de gawk.
-- Señala el final de las opciones de la línea de comando. Los siguientes argumentos no son
tratados como opciones incluso aunque empezasen con un guión ‘-‘. Esta interpretación de ‘–'
sigue las convenciones de parsing de argumentos POSIX. Esto es útil si tienes nombres de
ficheros que comiencen con un signo ‘-‘, o en shell scripts, si tienes nombres de ficheros que
serán especificados por el usuario y que podrían empezar con ‘-‘.
AWK

La función básica de awk es buscar líneas en


ficheros (u otras unidades de texto) que contienen
ciertos patrones.

Cuando en una línea se encuentra un patrón, awk


realiza las acciones especificadas para dicho
patrón sobre dicha línea.

Awk sigue realizando el procesamiento de las


líneas de entrada de esta forma hasta que se llega
al final del fichero.
AWK
awk ejecuta un programa tomando como insumo uno
o varios ficheros, este programa se declara entre
comillas simples y consiste en una serie de reglas
donde cada regla especifica un patrón a buscar, y una
acción a realizar cuando se encuentre dicho patrón en
el registro de entrada.
awk ‘programa’ fichero1 fichero2

Este formato de comando le dice al shell que ejecute awk y


use ‘programa’ para procesar los registros en el, o los
ficheros de entrada. Aparecen comillas simples alrededor del
programa de forma que el shell no interprete ningún
caracter awk como caracter especial del shell. Esto hace
que el shell trate programa por completo como un único
argumento de awk. Por lo tanto permite que ‘programa’
tenga una extensión de varias líneas.
AWK
Sintácticamente, una regla consiste en un patrón
seguido por una acción. La acción se encierra entre
llaves para separarlas de los patrones.

Las reglas se declaran entre comillas simples y están


separadas por caracteres newline, por lo tanto, un
programa awk presentaría la siguiente forma:

awk ‘patrón { acción }


patrón { acción }’ fichero

awk '/patron/ { print $0 }' fichero

>awk '/328/ {print $0}' gainesville-precip.csv

>328,1224,799,682,1382,980,2248,804,903,207,737,54
>783,272,1561,1316,628,1919,1945,1828,533,1100,801,328
AWK
La utilidad awk lee los ficheros de entrada línea a línea. Para
cada línea, awk comprueba todos los patrones de todas las
reglas. Si concuerdan varios patrones entonces se ejecutan
las distintas acciones de cada patrón, en el orden en que
aparecen en el programa awk. Si no concuerda ningún
patrón, entonces no se ejecuta ninguna acción.

Si una línea contiene ambas cadenas, ésta línea es impresa


dos veces, una vez por cada regla.

awk '/patron1/ { print $0 }
/patron2/ { print $0 }' fichero

>awk '/328/ {print $0}


>/1100/ { print $0 }' gainesville-precip.csv

>328,1224,799,682,1382,980,2248,804,903,207,737,54
>783,272,1561,1316,628,1919,1945,1828,533,1100,801,328
>783,272,1561,1316,628,1919,1945,1828,533,1100,801,328
AWK
Como cada regla se ejecuta linea por linea, se puede usar “;”
como separador de reglas para ejecutarla en una sola línea
awk ‘patrón { acción } ; patrón { acción }’ fichero

>awk '/328/ {print $0} ; /1100/ {print $0}' gainesville-precip.csv

Para declarar el separador de campo se usa la opción -F “,”

Entre las acciones se puede realizar la suma de una columna


con la sintaxis:
sum+=$columna

awk -F “separador”' ‘{ suma+=$4 } ; END { print suma }’ fichero

>awk -F "," '{sum+=$4} ; END {print sum}' gainesville-precip.csv


>22362
AWK
Siendo la sintaxis de awk:
awk 'programa' fichero1 fhichero2

Si el programa a ejecutarse es muy extenso se lo puede


poner en un archivo y llamar ese archivo desde awk
awk -f program-file fichero1 fichero2

Los archivos de programa awk podrían usar la extensión


‘.awk’ para que el nombre del fichero sea más legible y fácil
de localizar. Esto no afecta a la ejecución de un programa
awk.
OPERADORES ARITMÉTICOS
AWK
x+y Suma.
x-y Resta.
-x Negación.
x*y Multiplicación
x/y División. Ya que todos los números en awk son puntos flotante de doble precisión, el
resultado no se redondea a entero: 3 / 4 tiene el valor 0.75.
x % y Resto. El cociente se redondea a cero o a un entero, se multiplica por y y este
resultado se le resta a x.
La siguiente relación siempre se cumple:
b * int(a / b) + (a % b) == a
Otro efecto indeseable de esta definición de resto es que x%y sea negativo si x es
negativo. Por lo que,
-17 % 8 = -1
En otras implementaciones awk, la falta de signo del resto puede ser dependiente de
la máquina.
x ^ y Exponenciación: x elevado a la potencia de y. 2 ^ 3 tiene el valor 8. La secuencia de
caracteres ‘**’ es equivalente al carácter ‘^’. x ** y
OPERADORES DE
COMPARACIÓN AWK
x<y Verdad si x es menor que y.
x <= y Verdad si x es menor o igual que y.
x>y Verdad si x es mayor que y.
x >= y Verdad si x es mayor o igual que y.
x == y Verdad si x es igual a y.
x != y Verdad si x no es igual a y.
x~y Verdad si la cadena x encaja con la expresion regular representada por y.
x !~ y Verdad si la cadena x no encaja con la expresión regular representada por y.
subíndice in array Verdad si el array array tiene un elemento con el subíndice subíndice.
OPERADORES BOOLEANOS
AWK
booleana1 && booleana2 AND.
booleana1 || booleana2 OR.
!booleana NOT.
OPERADORES DE ASIGNACIÓN
AWK
valori += incremento Añade incremento al valor de valori para obtener el nuevo valor a
asignar a valori.
valori -= decremento Substrae decremento del valor de valori.
valori *= coeficiente Multiplica el valor de valori por coeficiente.
valori /= coeficiente Divide el valor de valori entre coeficiente.
valori %= módulo Le asigna a valori el resto de la división entre modulo.
valori ^= potencia Eleva a valori a la potencia de potencia.
valori **= potencia
OPERADORES
INCREMENTALES AWK
++valori Esta expresión incrementa valori y el nuevo valor se convierte en el valor de la
expresión.
valori++ Esta expresión hace que se incremente el valor de valori.. El valor de la
expresión es el valor antiguo de valori.
--valori Como ++valori, pero en lugar de adición, substrae. Decrementa el valor de
valori y devuelve dicho valor como resultado de la expresión.
Valori-- Como valori++, pero en lugar de añadir, substrae. Decrementa valori. El valor
de la expresión es el valor antiguo de valori.
CONDICIONANTE IF - AWK
condición ? si es verdadero : si es falso

Ejemplos:

x > 0 ? x : -x

x == y ? a[i++] : b[i++]

Condición If - else

if (condición) cuerpo-then [else cuerpo-else]

Ejemplo

if (x % 2 == 0)
print "x es par"
else
print "x es impar"

awk '{ if (x % 2 == 0) print "x is even"; else


print "x is odd" }'
BUCLE WHILE - AWK
while (condición)
cuerpo

Ejemplos:

awk '{ i = 1
while (i <= 3) {
print $i
i++
}
}'
BUCLE DO-WHILE - AWK
do
cuerpo
while (condición)

Ejemplos:

awk '{ i = 1
do {
print $0
i++
} while (i <= 10)
}'
BUCLE FOR - AWK
for (inicialización; condición; incremento)
cuerpo

Ejemplos:

awk '{ for (i = 1; i <= 3; i++)


print $i
}'
Caracteres de escape AWK
\\ Representa una barra invertida literal, `\'.
\a Representa el carácter “alerta”, control-g, código ASCII 7.
\b Representa el retroceso o espacio atrás, control-h, código ASCII 8.
\f Representa un formfeed, control-l, código ASCII 12.
\n Representa un carácter de nueva línea (newline), control-j, código ASCII 10.
\r Representa un retorno de carro, control-m, código ASCII 13.
\t Representa un tabulador horizontal, control-i, código ASCII 9.
\v Representa un tabulador vertical, control-k, código ASCII 11.
\nnn Representa el valor octal nnn, donde nnn son tres dígitos comprendidos entre 0 y 7.
Por ejemplo,
el código para el valor del carácter ASCII ESC (escape) es `\033'.
\xhh… Representa el valor hexadecimal hh, donce hh son dígitos hexadecimales (desde ‘0’
a ‘9’ y desde‘A’ a ‘F’ o desde ‘a’ a ‘f’) Al igual que la misma construcción en el ANSI C,
la secuencia escape continúa hasta que se encuentra el primer dígito no
hexadecimal. Sin embargo, el uso de más de dos dígitos hexadecimales produce
resultados indefinidos.
Variables Implícitas (Built-in) AWK
FS: El separador de campos de entrada, un blanco por defecto.
NF: El número de campos en el registro de entrada actual.
NR: El número total de registros de entrada leídos hasta el momento.
OFS: El separador de campos de la salida, un blanco por defecto.
ORS: El separador de registros de la salida, un salto de línea (newline) por defecto.
RS: El separador de registros de entrada, por defecto un salto de línea o newline. RS es
diferente, ya que solamente el primer carácter de su valor cadena se usa como
separador de registros. Si se le da a RS la cadena nula, entonces los registros son
separados por líneas en blanco. Si se le da a RS la cadena nula, entonces el
carácter newline o salto de línea actúa siempre como separador de campos, en lugar
de cualquier valor que FS pudiese tener.
RSTART: El índice del primer carácter que encaja con match; 0 si no existe ninguna
concordancia o encaje.
RLENGTH: La longitud de la cadena que encaja con match; -1 si no existe ninguna
concordancia o encaje.
SUBSEP: La cadena utilizada para separar subíndices múltiples en los elementos de un
array, por defecto "\034".

También podría gustarte