miércoles, 20 de enero de 2010

Declarar variables en AWK

En este articulo se vera como definir y usar variables en awk.

  • Las variables en awk deben empezar con una letra, seguido de un carácter alfanumérico o subrayado.
  • Las palabras claves no pueden ser usadas como variables en awk.
  • Awk no soporta declaración de varible como en otros programas.
  • Es recomendable inicializar las variables en awk con la sección BEGIN, la cual sera ejecutada una sola vez al principio.
  • No hay tipo de datos en awk. Si una variable en awk es tratada como numero o cadena depende del contexto en el que es usada.

Ahora se vera unos cuantos ejemplos para aprender como definir variables en awk.

Ejemplo AWK 1: Facturación de Libros

En este ejemplo, el archivo de entrada bookdetails.txt contiene los registros con los campos -- Numero Item, Nombre Libro, Cantidad y Calificación por Libro.

$ cat bookdetails.txt
1 Linux-programming 2 450
2 Advanced-Linux 3 300
3 Computer-Networks 4 400
4 OOAD&UML 3 450
5 Java2 5 200

Ahora la siguiente sentencia en awk lee y procesa el archivo bookdetails.txt y generara el reporte de salida -- calificación de cada libro vendido y monto total de todos los libros vendidos.

Awk puede leer comandos desde el Terminal pero también puede leer comandos desde un archivo usando la opción -f.

Sintaxis:

$ awk -f script-filename inputfilename

Ahora se vera el código para facturación de libros:

$ cat book-calculation.awk
BEGIN {
total=0;
}
{
itemno=$1;
book=$2;
bookamount=$3*$4;
total=total+bookamount;
print itemno," ", book,"\t","$"bookamount;
}
END {
print "Total Amount = $"total;
}

En el código de arriba:

  • La sección de BEGIN inicializa la variable total, itemno, total, book, bookamount son variables awk definidas por el usuario.
  • En la sección Action, Quantity*bookprice (cantidad por precio de libro) sera almacenado en la variable bookamount. Cada bookamount sera sumado al total.
  • Finalmente, en la sección END la variable total tendrá el monto total.

Ahora se ejecuta el codigo book-calculation.awk para generar el reporte que mostrara cada calificación y la cantidad total.

$ awk -f book-calculation.awk bookdetails.txt
1 Linux-programming $900
2 Advanced-Linux $900
3 Computer-Networks $1600
4 OOAD&UML $1350
5 Java2 $1000
Total Amount = $5750

Ejemplo AWK 2: Calculo de Notas

En este ejemplo se creara un archivo de entrada “student-marks.txt” conteniendo lo siguiente -- Nombre Alumno, Numero de Curso, Nota 1, Nota 2 y Nota 3.

$ cat student-marks.txt
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37 65
Edwin 2537 78 67 45
Dayan 2415 30 47 20

Ahora el siguiente código awk calculara y generara el reporte para mostrar el Promedio de cada estudiante, promedio Nota 1, promedio Nota 2 y promedio Nota 3.

$cat student.awk

BEGIN {
test1=0;
test2=0;
test3=0;
print "Name\tRollNo\t Average Score";

}
{
total=$3+$4+$5;
test1=test1+$3;
test2=test2+$4;
test3=test3+$5;
print $1"\t"$2"\t",total/3;
}
END{
print "Promedio de Nota 1="test1/NR;
print "Promedio de Nota 2="test2/NR;
print "Promedio de Nota 3="test3/NR;

}

En el código de arriba

  • En la sección BEGIN todas las variables awk son inicializadas a cero, test1, test2, test3 y total son variables awk definidas por el usuario.
  • En la sección ACTION $3, $4, $5 son Test1, Test2 y Test3 respectivamente. La variable total es la suma de las 3 notas de cada estudiante. Las variables awk test1, test2 y test3 tienen el puntaje total de cada test.
  • En la sección END se divide cada test total entre el numero total de registros (alumnos) lo que dará el promedio. NR es una variable propia de awk la cual ofrece el numero total de registros en la entrada.

Ejemplo AWK 3: Reporte HTML para el Detalle de Alumnos

En los dos ejemplos anteriores, se ha visto variables awk que tienen números como valor. En este ejemplo se mostrara un código awk para generar un reporte HTML para el nombre de los alumnos y el curso.

$ cat string.awk
BEGIN{
title="AWK";
print "<html>n<title>"title"</title><body bgcolor="#ffffff"
>n<table border=1><th colspan=2 align=centre>Student Details
</th>";

}
{
name=$1;
rollno=$2;
print "<tr><td>"name"</td><td>"rollno"</td><
/tr>";

}
END {
print "</table></body>n</html>";
}


Utiliza el mismo archivo student-marks.txt que se ha creado anteriormente.

$ awk -f string.awk student-marks.txt
<html>
<title>AWK</title><body bgcolor="#ffffff">
<table border=1><th colspan=2 align=centre>Student Details
</th>
<tr><td>Jones</td><td>2143</td></tr>
<tr><td>Gondrol</td><td>2321</td></tr>
<tr><td>RinRao</td><td>2122</td></tr>
<tr><td>Edwin</td><td>2537</td></tr>
<tr><td>Dayan</td><td>2415</td></tr>
</table></body>

Se puede guardar la salida para obtener una tabla HTML. En el código de arriba la variable llamada name y rollno son variables de tipo cadena por que están usadas en un contexto de cadena.

No hay comentarios: