PDF de programación - El lenguaje AWK

Imágen de pdf El lenguaje AWK

El lenguaje AWKgráfica de visualizaciones

Publicado el 07 de Junio del 2018
303 visualizaciones desde el 07 de Junio del 2018. Una media de 35 por semana
46,9 KB
8 paginas
Creado hace 85d (27/05/2018)
27/5/18

awk.txt

1

EL LENGUAJE AWK

1.- Introduccion.

awk es una de esos programas-joya con que nos obsequia el
mundo UNIX. Conocido y apreciado por los usuarios mas
avanzados y notablemente desconocido por el resto, es el
lenguaje que, entre otras cosas, podria ahorrar mucho tiempo,
dinero y esfuerzo de programacion para gestion de pequeñas y
medianas bases de datos, personales o de empresas. Puede
sustituir tambien con ventaja a programas shell que combinen
filtros como grep, sed, join, cut, paste y otros, ya que los
programas tipicos awk constan de una o dos lineas, y esto es
suficiente para efectuar operaciones notablemente
sofisticadas.

awk fue originalmente diseñado e implementado por A.H. Aho,
B.W. Kernighan y P.J. Weinberger ( de ahi awk ) en 1977, en
parte como un experimento para mostrar como las herramientas
UNIX grep y sed podian generalizarse para trabajar con numeros
ademas de texto. En particular, los autores estaban
interesados en expresiones regulares y editores programables.
Aunque diseñado para escribir pequeños programas, pronto
atrajo a gran numero de programadores, quienes produjeron
muchos programas extensos que pusieron de manifiesto las
limitaciones de la implementacion original. Por eso, en 1985
la version original fue mejorada.

En su estado actual, awk es un lenguaje tremendamente
versatil, que ha sido ý es usado para administracion de bases
de datos, diseño de circuitos, analisis numerico, graficos,
diseño e implementacion de compiladores, administracion del
sistema, lenguaje de entrada para no programadores y cursos de
ingenieria de software.

2.- Empezando con awk.

Antes de nada, una advertencia. Este tutor esta basado
estrechamente en el libro "The awk programming language", de
A.V. Aho, B.W. Kernighan y P.J. Weinberger. Si le es posible,
prescinda de este humilde resumen y acuda al original.

2.1.- Primer programa.

En adelante, usaremos una pequeña base de datos ficticia.
Suponemos que se encuentra en el archivo datos.emp y contiene
las siguientes lineas, donde el primer campo es un nombre, el
segundo un precio por hora y el segundo el numero de horas
trabajadas.

Belen 600 0
Daniel 500 0
Marcial 657 20
Maria 450 12
Susana 525 14

El programa que calcula el sueldo de todo aquel empleado que
ha trabajado mas de 0 horas es el siguiente:

awk ' $3 > 0 { print $1, $2*$3} ' datos.emp

Este programa invoca al interprete de awk con `awk', para que
ejecute el programa que se da entre comillas, y que tomara la
entrada del archivo `datos.emp'. Su salida es la siguiente:

Marcial 13140
Maria 5400
Susana 7350

Los programas awk constan esencialmente de parejas patron-
accion. En el ejemplo que nos ocupa, el patron lo satisfacen
aquellas lineas cuyo tercer campo es mayor que cero, y la
accion consiste en imprimir el primer campo, el nombre, y el
producto del segundo por el tercero, el sueldo. Como segundo

file:///home/xavi/smbhome102/xavi/tmp/radiosyculturalibre.com.ar/compartir/biblioteca/PROGRAMACION/shell/awk.txt

2

27/5/18
ejemplo, el programa awk que imprime el nombre de las personas
que no han trabajado es el siguiente:

awk.txt

awk ' $3 == 0 { print $1}' datos.emp

y su salida es la siguiente:

Belen
Daniel

Normalmente, es mas comodo usar la sintaxis

awk -f programa entrada

donde `programa' es el fichero con el programa awk que se va a
ejecutar y `entrada' es una lista de uno o varios archivos
sobre los que va actual el programa. Si se omite esta lista,
awk tomara la entrada estandard.

Si el programa awk contiene un error, el interprete avisara
del mismo, y no intentara ejecutarlo. Sin embargo, existen
errores (p. ej. division por cero) que solo pueden detectarse
en tiempo de ejecucion. En este caso, awk detendra el programa
y dara un mensaje de error.

2.2.- Imprimiendo campos y lineas

Hemos usando antes la instruccion `print $1', que indica que
se imprima el primer campo de la linea. Cuando se omite el
argumento de print, se imprime la linea entera. Por defecto,
toda linea impresa por awk termina en un caracter `0, y los
argumento de print separados por una coma se imprimen
separados por un espacio en blanco, aunque este comportamiento
puede cambiarse.

En cuanto a la forma de referirse a los campos, no es
obligatorio un digito tras el caracter `$', sino que puede
usarse cualquier expresion que produzca un valor entero.

awk tiene muchas variables internas. Por ejemplo, `NF' es el
numero de campos de cada linea, a medida que estas se leen.
Una instruccion legal podria ser entonces:

{print NF, $1, $NF}

Otra de las variables internas de awk es `NR', que lleva la
cuenta de las lineas leidas hasta el momento. Puede usarse
para numerar las lineas a la salida. Por ejemplo, el programa

{print NR,$0}

produce la salida

1 Belen 600 0
2 Daniel 500 0
3 Marcial 657 20
4 Maria 450 12
5 Susana 525 14

Ademas de variables, print puede colocar texto. Para ello, se
le proporciona como argumento, escribiendolo entre comillas.
Pruebese por ejemplo el programa:

{ print "la paga de ",$1," es de ",$2*$3," euros."}

Normalmente, sobre todo cuando se van a obtener listados
largos, deseamos un minimo formato para la salida, de manera
que los campos similares aparezcan encolumnados. En el ejemplo
que nos esta sirviendo de guia, la salida ganaria mucha
legibilidad si el sueldo de cada empleado se imprimiese en la
misma columna. Para cubrir estas necesidades se usa la funcion
`printf', cuya sintaxis es igual a la funcion homologa del
lenguaje C:

printf formato, valor1, valor2, valor3, ...

file:///home/xavi/smbhome102/xavi/tmp/radiosyculturalibre.com.ar/compartir/biblioteca/PROGRAMACION/shell/awk.txt

27/5/18

awk.txt

3

donde `formato' es una cadena que contiene texto para ser
impreso tal cual e intercaladas en este texto especificaciones
sobre como deben imprimirse los valores que van a
continuacion. Una especificacion de formato consta del
caracter `%' seguido de algunos caracteres que dependen del
tipo de formato en particular que se desea, por ejemplo, `s'
para cadenas, `f' para numeros reales. De esta forma, nuestro
primer programa podriamos reescribirlo como:

$3 > 0 { printf "%-8s .... %8.1f euros\n",$1,$2*$3) } datos.emp

obteniendo la salida

Marcial .... 13140.0 euros
Maria .... 5400.0 euros
Susana .... 7350.0 euros

Aqui, `%-8s' indica que se va a imprimir una cadena (s),
justificada a la izquierda (-) en un campo de 8 caracteres de
ancho. El `-8' es opcional. De la misma forma, `%8.1f' indica
que se imprima un numero real, en un campo de ocho caracteres
de ancho, con un decimal.

2.3.- Combinando patrones.

Los patrones puede combinarse mediante los operadores logicos
AND, OR y NOT, que en awk se escriben respectivamente `&&',
`||' y `!'. Por ejemplo, para imprimir los nombres de aquellos
empleados que ganan mas de 400 euros a la hora (ciertamente
bien pagados!) y que han trabajado mas de 15 horas:

$2>=400 && $3>=15 {print $1}

que da la salida

Marcial

Observese que aquellas lineas que satisfacen mas de una
condicion son impresas solo una vez.

2.4.- Validando datos.

--Siempre-- hay errores en los datos reales, y awk es una
excelente herramienta de depuracion. La validacion es un
proceso esencialmente negativo, es decir, se advierte de las
lineas que pueden contener datos erroneos, y no se dice nada
de las lineas correctas. El siguiente programa muestra como
puede usarse awk para validacion de datos. Este es un programa
de varias lineas, y por tanto no es practico introducirlo
desde linea de comandos. Mejor ponerlo en un fichero, p. ej.
`valida.awk', y ejecutarlo mediante `awk -f valida.awk
datos.emp'.

NF != 3 { print $0, "numero de campos distinto de 3" }
$2 < 3.35 { print $0, "precio por hora demasiado bajo" }
$2 > 10 { print $0, "precio por hora demasiado alto" }
$3 < 0 { print $0, "horas trabajadas negativas" }
$3 > 60 { print $0, "demasiadas horas trabajadas" }

2.5.- Bloques BEGIN y END.

Un bloque BEGIN contiene entre llaves una serie de acciones
que se llevan a cabo antes de que se procese la primera linea
del archivo. Por ejemplo, ejecute el siguiente programa awk:

BEGIN { print "NOMBRE EUR/HORA HORAS"
print " "
}
{ print NR, $0 }

Este programa no consta de patrones, unicamente de acciones.
El bloque BEGIN le pone nombre a las columnas e imprime una
linea en blanco. El segundo bloque de acciones simplemente
imprime la linea, numerandola.

file:///home/xavi/smbhome102/xavi/tmp/radiosyculturalibre.com.ar/compartir/biblioteca/PROGRAMACION/shell/awk.txt

27/5/18

awk.txt

4

De la misma forma, existe un bloque END que se ejecuta despues
de que la ultima linea del archivo de entrada haya sido
procesada. Puede usarse por ejemplo para mostrar los calculos
realizados.

2.6.- Variables en awk.

awk permite el uso de variables numeric
  • Links de descarga
http://lwp-l.com/pdf11665  

Comentarios de: El lenguaje AWK (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

Revisar política de publicidad