Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
acemu:proyectos:linux:script_procesamiento_datos [2010/04/05 14:02] tabare |
acemu:proyectos:linux:script_procesamiento_datos [2011/02/27 15:19] (actual) luis |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== Procesamiento de datos por lote:====== | ||
- | ===== escribiendo Scripts para automatizar todo el proceso ===== | ||
- | |||
- | Referencias: | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | |||
- | En los artículos anteriores describimos el uso de varias herramientas, | ||
- | |||
- | Estos artículos pueden dar la idea de que procesar datos en **Linux** es largo y tedioso, que hay que escribir mucho en la consola o emulador de terminales y que realmente no vale la pena tomarse tanto trabajo. | ||
- | |||
- | En realidad los artículos reflejan el proceso mediante el cual un usuario común puede emplear diversas herramientas separadas para lograr un objetivo. Muestra el **análisis** del proceso. Pero falta la **síntesis**: | ||
- | |||
- | Eso es lo que pensamos mostrar en este artículo. | ||
- | |||
- | Para eso es menester comenzar mencionando que al trabajar en una consola un usuario en realidad está trabajando en un entorno de programación, | ||
- | |||
- | Hoy por hoy el shell más empleado bajo **Linux** probablemente es **bash**. Cada vez que abrimos una consola o ventana de emulador de terminal, el programa que nos " | ||
- | |||
- | En la siguiente figura hemos hecho una captura de pantalla mostrando una ventana del emulador **Konsole**, | ||
- | |||
- | |||
- | {{ : | ||
- | |||
- | Bajo este **shell** es que hicimos todo el procesamiento de datos descrito en los artículos anteriores. El entorno de trabajo es extremadamente sencillo: una simple línea de comandos (**CLI**: **C**ommand **L**ine **I**nterface), | ||
- | |||
- | Pero así como podemos escribir órdenes o comandos y ejecutarlos de manera interactiva, | ||
- | |||
- | Vamos a mostrar cómo se hace esto. | ||
- | |||
- | Ya vimos en los artículos anteriores todos los comandos que deben ejecutarse para lograr el resultado final. La idea es poner todo eso en un único script | ||
- | |||
- | === En el comienzo fue... SheBang! === | ||
- | |||
- | Los **scripts** no son otra cosa que archivos de texto que deben ser interpretados, | ||
- | |||
- | Esto se resuelve agregando en la primer línea del archivo el famoso **shebang** (también conocido como hashbang, hashpling, pound bang, o crunchbang), | ||
- | |||
- | Esta secuencia de dos caracteres, se interpreta por el intérprete de comandos desde el cual se lanza la ejecución del archivo como una directiva que le dice qué programa debe emplear para interpretar el conjunto de comandos que sigue en el archivo. | ||
- | |||
- | Así, si uno desea escribir un programa en **bash**, pondría en la primer linea del archivo la siguiente directiva: | ||
- | |||
- | #!/bin/bash | ||
- | |||
- | ''/ | ||
- | |||
- | Si uno quiere escribir un programa en Perl, pondría: | ||
- | |||
- | # | ||
- | |||
- | Un programa escrito en Python, usaría el siguiente **shebang**: | ||
- | |||
- | # | ||
- | |||
- | ¿Se entiende la idea? | ||
- | |||
- | Ahora bien, si la mayoría de los comandos que ejecutamos lo hicimos empleando **bash** como intérprete, | ||
- | |||
- | Eso es lo que adjuntamos en el siguiente bloque de código, que escribiremos empleando algún editor de texto: vi, nano, pico, joe, emacs, etc. (otra vez, etc. no es un editor de texto de Linux! ;-)) y luego salvamos al archivo con el nombre '' | ||
- | |||
- | '' | ||
- | |||
- | < | ||
- | #!/bin/bash | ||
- | |||
- | # Modo de empleo: ./ | ||
- | |||
- | # Se supone que el único argumento de entrada del programa es el archivo de datos | ||
- | # exportado en formato CSV desde el programa de recolección de datos del DataQ | ||
- | # Mantendremos intácto el archivo original. | ||
- | |||
- | orig=$1 | ||
- | |||
- | # copiamos los datos para preservar el original | ||
- | cp $orig $$.csv | ||
- | |||
- | # Convertimos los datos a formato Unix | ||
- | dos2unix $$.csv | ||
- | |||
- | # Eliminamos líneas en blanco y formateamos los datos de manera adecuada | ||
- | # Obsérvese cómo encadenamos la ejecución de grep y awk mediante un pipe " | ||
- | |||
- | grep -v " | ||
- | BEGIN {c=0; | ||
- | {c=c+1; printf "%-10f %-10f\n", | ||
- | |||
- | # Ahora corremos el programa pyxplot para generar el gráfico | ||
- | |||
- | pyxplot <<EOF | ||
- | set terminal pdf | ||
- | set output " | ||
- | set width 20 | ||
- | set size 10 | ||
- | set nodisplay | ||
- | set title ' | ||
- | set xlabel ' | ||
- | set ylabel ' | ||
- | set nokey | ||
- | set grid x1y1 | ||
- | spline f() " | ||
- | g(x)=(f(x)+0.488)*19.198-0.1311 | ||
- | plot [0.5:2.5] g(x) with color blue | ||
- | set display | ||
- | refresh | ||
- | EOF | ||
- | |||
- | # finalmente algo de housekeeping: | ||
- | rm $$.csv $$.xy | ||
- | </ | ||
- | |||
- | |||
- | '' | ||
- | Es una manera de decirle a pyxplot que el programa que queremos que ejecute se encuentra en el propio cuerpo del script. Para eso se usa como '' | ||
- | el programa de **pyxplot** termina en el **EOF** luego del **refresh**. '' | ||
- | |||
- | Pero antes de poder usar este programa, debemos otorgarle permisos de ejecución. Una manera de hacerlo en **Linux** es con el comando **chmod**: | ||
- | < | ||
- | chmod 750 programa.sh | ||
- | </ | ||
- | |||
- | Para usar el programa, por ejemplo sobre el archivo **'' | ||
- | |||
- | < | ||
- | ./ | ||
- | </ | ||
- | |||
- | Eso genera como salida el archivo: | ||
- | |||
- | {{ : | ||
- | |||
- | que podemos ver con el programa **kpdf** o cualquier visor PDF que tengamos a mano (¿acroread? | ||
- | |||
- | |||
- | **OJO:** este script es muy básico, apenas aglomera el conjunto de comandos que ensayamos en los artículos anteriores. Puede mejorarse y **mucho!**, pero eso queda como ejercicio para el inadvertido lector ;-) | ||
- | |||
- | [[acemu: | ||