jueves, 9 de julio de 2009

Obtener totales con AWK

Hay veces que en nuestro trabajo somos solicitados para realizar un spool de datos (millones de registros) y finalmente informar el total de algunas columnas.

Dependiendo de varios factores como cantidad de registros, distribución de datos y relacionamientos, la ejecución de la consulta primaria para obtener los datos, puede ser costosa. Un tiempo similar puede tomarnos ejecutar la consulta para obtener el total de las columnas.

Sin embargo, el uso de AWK para obtener los totales, puede ser un diferencial. La performance de esta operación en el archivo de texto sobre la ejecución de un SQL (usando sum y group by) puede ser abismal (de muchos minutos a un par de segundos).

Ejemplo: como obtener el total de la segunda y tercera columna de un archivo spool con millones de registros y valores separados por pipe '|'.

awk -F"|" '{sum1+=$2; sum2+=$3} END {print sum1,sum2}' archivo_entrada.csv

Primero en la sección de procesamiento línea a línea (primer par de { }) sumamos los valores de la segunda y tercera columna ($2, $3) en dos variables, sum1 y sum2, por defecto inicializadas en cero.

Finalmente la sección de ejecución final muestra los valores de sum1 y sum2.

Si deseamos usar otro delimitador bastará con alterar el parámetro -F.

Así de simple y eficiente.

No hay comentarios: