miércoles, 9 de octubre de 2013

AWK

actualmnte en openBSD y Linux se utiliza GAWK,  que es la variante de GNU.

esta en los libros de éstos autores.

Aho, Weinberger, Kernighan
Addison -Wesley

Sintáxis:

awk -f programa [-v var=valor][archivos(s)]

awk 'programa' [-v var=valor][archivo(s)]

si le queremos enviar una variable desde la línea de comandos es con -v var=valor de la variable..

Estructura de un programa

Los programas awk son una secuencia de enunciados PATRÓN-ACCIÓN.

patrón {acción}
patrón {acción}

Patrón : Condición que debe cumplir la línea

Acción: Para que se pueda ejecutar se debe cumplir la condición.

Evaluación Patrón -Acción

Ej:
p{a}, pero se puede encontrar otras variantes, donde solamente haya patrón.

* Si no se especifica la acción, la línea se imprime.

o
* Si no se especifica patrón, la acción corresponde a todas las líneas del archivo.

----------------- - > linea 1
-----------------

si la línea 1 coincide con el patrón se ejecuta la acción.

así se ejecuta para todas la líneas del archivo.

siendo programas que procesan línea por línea.

Nota: Exísten patrones especiales(requieren acción)

BEGIN : implica que se ejecutará todo lo que hay en la acción antes de leer el archivo de entrada.
Ej:
BEGIN{a}

END: necesita forzosamente tener una acción, cuando encuentre el end of file EOF, del archivo se va a la acción de END
Ej:

END{a}

otros patronces corresponde a expresiones regulares.

/expr_reg/ : Todas las expresiones regulares se ponen entre diagonales.

patrón1,patrón2 -> Son patrones de rango. Coincide con cada línea desde una que coincida con patrón1, hasta la siguiente línea que coincida con patrón2.

no necesariamente patrón, necesita tener evaluación, normalmente son para expresiones regulares.

Nota: Dentro de los patrones se pueden tener funciones.

Ej:

a==1{a} -> si la linea se encuentra un 1 se ejecuta {a}

o

ALogin/{a=1}
a==1{a}   -> con ésto se podrá ejecutar el flujo del programa.

Nota: no se necesitan declarar las variables, en el momento en que se usan exísten.

también awk inicializa las variables a 0 o cadena vacía.

* Realiza conversión automática de tipos por lo que se dice que no hay tipos.

Ej:

a=1
b=2
c=a+b

awk, se encarga de hacer las conversiones numéricas. Pero sí :

d="hola" a

entonces cuando se termine :
d=hola1 -> no interesandole si es un número, concatenando las cadenas con números o caractéres.

Ejemplo:
Se le pueden pasar argumentos, que no se consideran para inicializar, si no los toma como argumentos.
awk -f prog.awk arch1 arch2

Variables especiales

ENVIRON
FILENAME
FNR
NR
        -> el separador por default de registros es el cambio de línea.
RS


conceptos a conocer -> campo registro y archivo.

campo-> una agrupación de campo, nos da un registro.

una agrupación de registro - > nos da un archivo.

Ej:
login:OUID:GID:GEO:HOME:SHELL -> son 7 campos, que nos da en conjunto un archivo, que es el passwd.

awk trabaja mucho con esos conceptos.

siendo el separador de campos es el cambio de línea.

awk es a nivel bajo, permitiendo procesar archivos.

La primera variable es FILENAME

la segunda variable es: el numero de registros que se está trabajando pero del FILENAME.

entonces se necesita saber que registro se esta procesando de que archivo, pero también se puede guardar el número de registros. etc.

de manera que se puede saber que registros se han procesado.

NR -> va cambiando conforme se va leyendo.

RS -> es el separador de entrada de registros.

División de Líneas en Campos.

por omisión, un campo es una secuencia de caracteres que no contiene espacios ni tabuladores.

FS -> nos da el valor por omisión del separador de campos de entrada.
pero si quisieramos procesar el archivo /etc/passwd.
el separador de campos sería :
pero tenemos que decirselo antes de leer la línea si no no aplica.

OFS -> variable de separador de campos de salida, que por omisión es blanco.
NF -> nos arroja el número de campos de una línea.

Ej:

1         2       3
hola como estas

cuando leamos la línea, NF - nos arrojará 3 porque son 3 campos.

otras variables especiales:

$0 -> Toda la línea
$1 -> primer campo
$NF -> Último campo

Nota: en awk podemos trabajar redireccionamiento, pero no en la línea de comandos, si no dentro del código de awk. Son muy parecidos a los redireccionamientos de shell, excepto por algunas considereaciones, pero en el momento que hacemos un redireccionamiento, se abre una archivo.

Pero si no se cierra explícitamente el redireccionamiento, el archivo se quede abierto.

Ej:

"w" > "archivo"

close("w")

la primera vez, mientras no se haga el close, el redireccionamiento no es destructivo; después de que se haga el close se hace destructivo el redireccionamiento.

Salida de datos

Función print

print expresión

Cualquier cosa que "No sea una variable" o "intstrucción" se debe poner entre comillas.

awk 'BEGIN{print "hola mundo"}'

awk '{print $1}' nomina.dat

Función printf
(imprime el formato)

printf "formato", variables

awk '{printf "%10s %10.2f\n",$1,$3}' nomina.dat

Operadores

Operadores aritméticos: +-*/%^
Operadores de asignación: =, +=, -=,*=,/=,^=
Operadores de Incremento y decremento: ++, --
Operadores de coincidencia: ~, !~
Operadores de comparación : &&, || , !
Operadores de concatenación: Espacio_en_blanco
Expresiones de condición: expresión ? Si_V: Si_F
La expresion regular se debe poner entre diagonales:
/expr_reg/

Getline

Sirve para leer una línea de datos.
No altera el flujo del progra,a

sirve para leer las lineas de datos sin pasarsela a línea de comandos.


su salida exitos es 1
error ->


Getline
lee l siguiente linea del archivo de entrada, sin alterar el flujo del programa.

Afecta las variables $0, $n, NF, NR, FNR.

getline variable       ->       afecta a la variable, NR, FNR.


getline < "archivo"    -> Se puede redireccionar la entradad desde un archivo, Afecta a $0, $n, NF


getline < "/dev/tty" -> lee del teclado, el genérico es tty


getline < "-"  -> lee de la entrada estándar.

"comando" | getline   -> Ejecuta el comando y envía la siguiente línea de la salida a getline. Afecta
 a $0

Ejemplos:




para el archivo frutas2

busca con $0 la coincidencia con pera, si si es la obtiene si no, imrime "Num Linea",  NR que es el número de registro de la línea.
despues imprime Linea, con el contenido de la línea actual $0


Ejemplo2:





Tomando como referencia /usr/bin/awk, que es el lugar donde esta el intérprete, podemos colocarlo hasta arriba del script para que sea interpretado inmediantamente al hacer ./


cuando ejecutamos w
simplemente, nos da 4 líneas.

Ej:

awk '<- enter="" p="">>BEGIN{
>"w" | getline
> print $0
>"w" | getline
> print $0
> "w" | getline
> print $0
> "w" | getline
> print $0
> "w" | getline
> print $0
>}'

con getline, solamente se obtiene la primera línea.

despues se ejecuta otra vez w, cuando hace getline se va por la segunda línea de entrada, no por la primera.

en la 4 se termino de leer la entrada de w, pero cuando se hace la 5ta ya no hay nada, por lo tanto repite la línea anterior.

lo que se debió hacer antes de la getline.

osea en la 4 , es hacer close a w

print $0 ; close("w")


Arreglo

Los arreglos no se declaran, se ceran automáticamente a medida que son necesitados.
* Los arreglos se enumeran a partir de 1.
* No hay problemas de memoria contigua ya que enrealidad son variables separadas.
* Los elementos no se almacenan en un orden determinado.

los arreglos se almacenan en direferentes lugares..:
|_|
     |_|
              |_|
No necesariamente estan contiguos, eso viene debido a que no se declaran, por lo tanto no hay reserva de memoria.

Lo crea cuando lo va a necesitar.

Los arreglos numéricos, se enumeran a partir de 1.

es decir:

N[1]
N[2]
.. N[n]
creandolos a partir de 1, pero no es completamente cierto.

por lo tanto cuando se hace un barrido de un arreglo, awk no acsegura que muestre los elementos ordenadamente.
eso depende del control :

for i= 1 in N
  print N[i]

como no le estamos dando un orden al for, puede imprimir el arreglo en desorden.

Arreglos asociativos

Una característica de awk es que los índices pueden ser un número o una cadena de caracteres e incluso ambos.

:P

Ej: N[gato]
      N[perro]

por lo tanto, todos los arreglos en awk son asociativos.

Función split

siempre regreesa elementos numéricos del arreglo.

split(cadena, arreglo[,separador])

a parte de los elementos separados, los pone en un arreglo.

Ej: awkromanos.awk






la función split regresa 10, si le asignáramos eso a una variable tendría 10, a parte de crear el arreglo con los elementos numéricos

$1 > 0 && $1 < 10 -> imprime números del primer campo


Nota: el lunes empieza


Tarea: acronimo.dat o acronimos.dat

otro es datos2 y acronimos.awk


cuando corramos tenemos que correrlo asi
awk -f acronimos.awk -f acronimos datos2    -> lo que tenemos que hacer es explicar qu ehace .

es la tarea para mañana


estudiar: examen viene de 2 partes,
 
el la parte teórica, saca a los alumnos, bla bla, si suena el cell baja punto a tosdos D:

No hay comentarios:

Publicar un comentario

Entradas populares