|
G A C E T
A D E L I N U X |
|
Extracción de Datos Rápida y Sucia en AWK
Por Phil Hughes Traducción al español por Isaac Bleuss Varela
|
Hace muchos años, probablemente cerca de 20, había una especie de consenso en los grupos de noticias comp de Usenet sobre utilizar la mínima herramienta para dejar la tarea hecha. Esto es, alguien preguntaba por un método rápido y sucio de hacer algo y las respuestas podían incluir una solución C seguida de una solución AWK, seguida de una solución sed y así sucesivamente.
Hoy, todavía intento utilizar esta filosofía cuando me enfrento a un problema. En este caso particular, seleccioné AWK pero si alguno de vosotros de los viejos tiempos está leyendo esto espero que salte con una solución basada en sed.
Me registré para un extracto diario del cambio de divisa extranjera. Es gratis y tú también puedes subscribirte --simplemente ve aquí. La mayoría de los días echo un rápido vistazo a cómo va el Dólar respecto del Euro y entonces guardo el correo. Algunos días simplemente lo guardo. Siempre he pensado que, algún día, voy a escribir un programa para que me muestre la tendencia pero siempre ha tenido baja prioridad.
Ayer, estaba mirando unos pocos de los mensajes de correo guardados, y me di cuenta que mientras que escribir una precioso programa gráfico tenía baja prioridad, escribir una solución rápida y sucia tomaría menos tiempo que el muestreo aleatorio que yo hacía. Lo que necesitaba eran fechas y números junto con un gráfico minimalista de la tendencia.
El primer paso fue mirar los datos. Éste es un extracto de parte de un mensaje.
>From list@en.ucc.xe.net Wed Sep 10 12:22:53 2003 ... XE.com's Currency Update Service writes: Here is today's Currency Update, a service of XE.com. Please read the copyright, terms of use agreement, and information sections at the end of this message. CUS5D0B3D5C16D9 ____________________________________________________________________________ If you find our free currency e-mail updates useful, please forward this message to a friend! Subscribe for free at: http://www.xe.com/cus/ ____________________________________________________________________________ <PRE> Rates as of 2003.09.09 20:46:35 UTC (GMT). Base currency is EUR. Currency Unit EUR per Unit Units per EUR ================================ =================== =================== USD United States Dollars 0.890585 1.12286 EUR Euro 1.00000 1.00000 GBP United Kingdom Pounds 1.41659 0.705920 CAD Canada Dollars 0.651411 1.53513 ... </PRE> For help reading this mailout, refer to: http://www.xe.com/cus/sample.htm ...Las líneas ... simplemente indican que he retirado un montón de líneas sin interés.
Hay tres cosas que utilizo para producir el informe:
La parte numérica de la solución es realmente fácil. Sólo guardar la información de fecha y del cambio. Cuando llego a la línea </PRE>, lo imprimo.
La parte gráfica se hace simplemente imprimiendo un número de signos de suma que correspondan al cambio. Para obtener una resolución decente necesitaría o una línea de salida muy larga o algún tipo de desplazamiento. Me decidí por el desplazamiento asumiendo que el Euro nunca bajará por debajo de los 90 céntimos de Dólar lo que es bastante seguro considerando la dirección en que va.
Finalmente, quería una cabecera. Utilizando el bloque BEGIN de AWK, puse un par de sentencias print. Como no me gusta contar caracteres, definí la variable over para que fuera el número de espacios que necesitaba colocar antes del título para alinearlo todo. Esto simplemente significa que yo tengo que correr el programa, ver cómo de desplazado queda y ajustar la variable.
Aquí está el código.
BEGIN {
over = " "
print over, " Cost of Euros in $ by date"
print over, ".9 1.0 1.1 1.2 1.3"
print over, "| | | | |"
}
/Rates as of/ { date = $4 }
/^USD/ { rate = $6 }
/^<\/PRE>/ {
printf "%s %6.3f ", date, rate
rc = (rate - .895) * 100
for (i=0; i < rc; i++) printf "+"
printf "\n"
date = "xxx"
rate = 0
}
Simplemente corriendo el programa con el fichero de correo como entrada imprime todas las líneas de resultado pero el orden es el de los datos del fichero de correo. El programa sort viene al rescate. El primer campo en la salida es la fecha y una elección cuidadosa del primer caracter de las líneas de título significa que todo se ordena directamente sin opciones. Así, para correrlo, usa:
awk -f cc.as messages | sort
y obtienes tu precioso informe. Redirige el resultado a través de more si tienes un montón de líneas a las que mirar.
Aquí está un ejemplo de la salida:
Cost of Euros in $ by date
.9 1.0 1.1 1.2 1.3
| | | | |
2003.01.02 1.036 +++++++++++++++
...
2003.08.28 1.087 ++++++++++++++++++++
2003.08.29 1.098 +++++++++++++++++++++
2003.08.31 1.099 +++++++++++++++++++++
2003.09.01 1.097 +++++++++++++++++++++
2003.09.02 1.081 +++++++++++++++++++
2003.09.04 1.094 ++++++++++++++++++++
2003.09.05 1.110 ++++++++++++++++++++++
2003.09.07 1.110 ++++++++++++++++++++++
2003.09.08 1.107 ++++++++++++++++++++++
2003.09.09 1.123 +++++++++++++++++++++++
2003.09.10 1.121 +++++++++++++++++++++++
2003.09.11 1.120 +++++++++++++++++++++++
2003.09.12 1.129 ++++++++++++++++++++++++
2003.09.14 1.127 ++++++++++++++++++++++++
2003.09.15 1.128 ++++++++++++++++++++++++
2003.09.16 1.117 +++++++++++++++++++++++
2003.09.17 1.129 ++++++++++++++++++++++++
2003.09.18 1.124 +++++++++++++++++++++++
2003.09.19 1.138 +++++++++++++++++++++++++
De acuerdo expertos de sed, os toca. --
Phil Hughes es el editor de Linux Journal, y por tanto de Linux Gazette. Anhela la permanencia viajando a diario desde su casa en la costa del Pacífico de la Olympic Peninsula. Como empleado, es "vicioso, malvado, tacaño y obsceno, pero algo así como maduro" como debería ser un jefe.