Saltar al contenido

Usando wget, awk, paste, cut y sed para tener datos en tiempo real en la web

En agosto de 2014 escribí en este blog sobre cómo representar gráficas en una web usando Dygraphs, una librería en Javascript que es ampliamente utilizada para publicar representación gráfica de datos en internet. En esa ocasión mostré un ejemplo cargando unos cuantos datos directamente en el código que hace la representación de la gráfica, pero comentaba que se puede hacer dándole directamente la ruta de un fichero .csv. Esta semana he estado trabajando un buen número de horas para ir un poquito más allá con esta herramienta. La idea era mostrar en la sección «predicción polvo africano» de este blog, datos en tiempo real (promedios horarios de las últimas 24 horas) de las concentraciones de polvo en diferentes puntos de Canarias.

Los datos provienen de la web de la Red de Control y Vigilancia de la Calidad del Aire del Gobierno de Canarias. Son datos que pueden consultarse libremente en dicha web pero, curiosamente, solo pueden verse en formato tabla. Se pueden descargar en formato .csv, en excell y en pdf, pero no te los representan en una gráfica. Mi idea era realizar yo la gráfica automáticamente, totalmente actualizada, y que se pudiese consultar en mi blog. Todo lo hice desde un ordenador con sistema operativo Linux.

grafica con dygraphs

La primera tarea, lógicamente, fue ingeniármelas para bajar los datos. En teoría debería ser lo más sencillo del mundo: un wget apuntando al enlace donde están los datos y listo. El problema es que en la web fuente de los datos no hay links fijos, sino que llaman a algún tipo de script para generar los datos. Además, todos los ficheros bajan con el mismo nombre. Dos días estuve (estuvimos, que conté con ayuda) intentando averiguar cómo hacerlo. Al final lo conseguimos, y lo que voy a mostrar aquí es el comando básico de wget para bajar un fichero y renombrarlo. Sería así:

wget -C «http://www.nombredelaweb.loquesea/rutaalfichero/» -O fichero1

El -O al final es lo que usas para renombrar el fichero que bajas. Como yo tenía que bajar muchos ficheros, ya que publican los datos por zonas de las islas, y los ficheros originales tienen todos el mismo nombre, tengo que usar esta opción sí o sí.

A partir de aquí lo que tenía eran 11 ficheros (csv en mi caso) con un montón de datos. Los ficheros .csv son como ficheros de excell (datos en filas y columnas), donde las columnas están separadas por una coma. Yo quería combinar los 11 ficheros en uno y quedarme con solo las columnas que me interesaban. Para ello usé el comando awk desde una terminal de mi distribución de linux.

Esta es la instrucción para combinar los ficheros (todos los que quieras).

paste -d , fichero1 fichero2 fichero3 fichero4 > ficherocombinado

Es importante que dejes un espacio entre la d y la coma. Luego vienen todos los nombres de los ficheros individuales, separados por espacios, y tras el > viene el nombre del fichero resultado de la combinación.

Una vez tienes el fichero combinado, con muchísimos datos, para quedarte solo con las columnas que necesitas tienes que hacer esto:

cut -d , -f 1,2,3,5,7,9,11 ficherocombinado > ficherorecortado

Lo que le hemos dicho al ordenador con esta instrucción es que se quede con las columnas 1,2,3,5,7,9 y 11 del fichero que creamos antes, y que el resultado lo escriba en el fichero resultante. Ojo, que aunque la instrucción se llame cut (cortar), lo que hay que darle es el número de las columnas con las que nos queremos quedar, no las que queremos eliminar.

Una vez tenía este nuevo fichero con justo los datos que necesitaba (fecha, hora y PM10 en diferentes estaciones de medida que elegí) yo me encontré con un problema: la librería Dygraph solo admite las fechas en formato yyyy-mm-dd hh:mm, y en los ficheros originales lo que tenía era dd-mm-yyy en la primera columna, y hh:mm en la segunda columna. Necesitaba entonces cambiar de formato la primera columna y, una vez hecho, unir la primera y la segunda con los datos de fecha y hora separados por un espacio. Para ello usé el comando awk:

awk -F , ‘{split($1, a, «-«)$1=a[3]»-«a[2]»-«a[1]» «}1’ OFS = , ficherorecortado > ficheroconfechaok

Fíjate en lo que hice ahí. Le he dicho que en la columna 1 hay algo que tiene tres valores separados por un guión, y lo que quiero hacer es que lo sobreescriba con los elementos cambiados de orden, es decir, el año (que aparecía en tercer lugar en el formato original dd-mm-yyy) lo quiero delante, el mes se queda donde está, y el día (que aparecía en primer lugar) lo llevo al tercero. Luego le doy el nombre del fichero (el de antes, el que recorté para quedarme con los datos que necesito) y al final le doy el nombre del fichero resultado.

Ahora vamos con la combinación de la fecha y la hora en una misma columna. Vuelvo a usar el comando awk para ello:

awk -F , ‘{($1=$1″ «$2)}1’ OFS = , ficheroconfechaok > ficherofinal

Lo que he hecho es decirle que en la columna 1 escriba lo que era la 1 combinada con la 2 y separadas por un espacio, que se encontraban en el fichero que escribimos antes, y el resultado de ello lo escriba en un nuevo fichero.

Ya está, con esto ya tendría todo lo necesario para subir este fichero por ftp a alguna carpeta de mi web, darle la ruta al Dygraphs y que él solito haga la representación gráfica.

Cuando lo hice me encontré un pequeño detalle más que quise corregir. Resulta que algunos de los nombres de las estaciones de medida de donde provienen los datos, que salen en la leyenda de la gráfica, tienen letras con tilde o contienen una ñ. En ese caso el Dygraphs no es capaz de escribirlos bien. Entonces decidí aprovechar para cambiar los nombres de las estaciones en el fichero final (primera fila del .csv), añadiendo además el nombre de la isla en la que están. Para ello primero tuve que cambiar la codificación del fichero, de iso-8859-15 a utf-8. Si no lo hacía, el paso siguiente no me funcionaba.

iconv -f iso-8859-15 -t utf-8 ficherofinal > ficherofinal_utf8

Ahora ya solo queda el paso final, que es usar el comando sed para sustituir palabras. Aquí tienes un ejemplo:

sed -i ‘s/Tefía-Puerto del Rosario/Tefia-Puerto del Rosario (Fuerteventura)/g’ ficherofinal_utf8

Lo que hace el comando sed ahí es buscar en el fichero ficherofinal_utf8 dónde aparece la cadena de texto Tefía-Puerto del Rosario. Una vez la encuentra, la sustituye por la cadena Tefia-Puerto del Rosario (Fuerteventura). Esto lo hice con todos los nombres de estaciones que contenían algún caracter que el Dygraphs no es capaz de representar en la leyenda.

Estas y más instrucciones, para representar también mapas de predicción e imágenes de satélite, están una detrás de otra en scripts que ejecuto cada hora en segundo plano en mi ordenador gracias al administrador de tareas Cron. El ordenador está encendido y conectado a internet las 24 horas del día, bajando y procesando los datos, subiéndolos por FTP a mi web, y a partir de ahí puedes verlos desde cualquier lugar.

Ya ya está, el resultado final puede verse en esta página. Espero que esta explicación te sea útil para trabajar con datos para representar gráficamente en tu web.

Publicado enDivulgación

3 comentarios

  1. jose martinez jose martinez

    interesante podrías ayudarme tal vez
    estoy tratando bajar con wget desde linux las tablas de una web
    pero no he podido (web sobre stock holder, para procesar con file de números no desde las plataformas , no me agrad como trabajan las plataformas)
    gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Verificado por MonsterInsights