Awk

De Astillas.net
Versión
1:3.1.7.dfsg-5
Página principal
http://www.gnu.org/software/gawk/
Observaciones
Empleando la versión GNU de Awk llamada gawk


Enlaces y referencias

Conceptos

El programa awk trabaja con el siguiente esquema:

Texto de entrada -> Patrones de coincidencia -> Texto de salida 
                    y operaciones sobre el 
                    texto (código)

Existen dos patrones especiales:

  • BEGIN: que fuerza a evaluar su código justo al comienzo de todo el proceso.
  • END: igual pero evaluándo al final, cuando se han agotado los datos de entrada.

Si no se define ningún patrón de coincidencia de líneas el código a evaluar se lleva a cabo con todas las líneas.

Además de esto, awk efectúa un preproceso con los textos de entrada consistentes en separarlos en registros de datos y éstos, a su vez, divididos en campos.

Variable Predeterminado Uso
RS \n Record Separator o separador de registros, que generalmente suele ser el carácter de salto de línea.
FS \s Field separator o separador de campos.

Recetario

Sumar una columna de números

Para realizar una suma de los valores numéricos de una columna se puede emplear los siguiente:

$ awk '{ SUM += $1} END { print SUM }' < datos_de_entrada

suponiendo que la cifra sea la primera del archivo.

Si el separador de campos no es un espacio en blanco siempre podemos usar el parámetro -F para indicar cuál es y seleccionar la columna por número de orden. También nos podemos encontrar con cifras numéricas formateadas según la costumbre local (locale) por lo que es posible que las operaciones aritméticas no funcionen. Para adaptarnos a ello podremos emplear el parámetro --use-lc-numeric (con precaución ya que no funciona en todas las versiones):


$ cat datos_de_entrada 
  2010|A|         47|P|0003|       2197,80|25/01/2010|n|                                                                                      
  2010|A|         46|P|0003|        854,18|25/01/2010|n|                                                                                      
  2010|A|         45|P|0003|      13875,02|25/01/2010|n|                                                                                      
  2010|A|         44|P|0003|        662,94|25/01/2010|n|                                                                                      
  2010|A|         43|P|0003|        647,50|25/01/2010|n|                                                                                      
  2010|A|         42|P|0003|       1298,09|25/01/2010|n|                                                                                      
  2010|A|         41|P|0003|        113,04|25/01/2010|n|                                                                                      
  2010|A|         40|P|0003|       2229,63|25/01/2010|n|         
$ awk --use-lc-numeric -F"|" '{ SUM += $6} END { print SUM } ' < datos_de_entrada
21878,2