Operaciones De Columnas en AWK

AWK es un lenguaje de programación interpretado para UNIX y Linux, fue creado en Bell Labs por Aho, Weinberger y Kernigan. Es un lenguaje para generar mapeos y filtros (los dos tipos de operaciones mas importantes para el procesamiento de datos) de manera ráìda y eficiente en la terminal. AWK opera sobre archivos de columnas delimitadas, ya sea mediante espacios, tabuladores o otros separadores.

AWK es muy eficiente en el manejo de archivos grandes por la forma que tiene de operar sobre los archivos, reconoce los diferentes campos en una línea, pero va consumiendo el archivo línea por línea así que es muy difícil que consuma demasiada memoria, ya que nunca guarda el archivo completo en RAM.

AWK es muy poderoso y versátil, además de ser un lenguaje de programación completo. Aqui sólo pondré ejemplos de operaciones sobre columnas:

Para llamar un script con extensión .awk en la terminal hacemos lo siguiente:

$ awk -f <script>.awk <input>.csv  > <output>.csv

El formato básico del script debe ser de la siguiente forma (Para leer CSV):

#!/bin/awk -f
BEGIN {}  # Begin section
{}        # Loop section
END{}     # End section

Vamos a usar como ejemplo el siguente archivo file1.csv:

file1.csv
col1,col2,col3,col4
1,1,B,0.1594
0,2,B,1.0264
1,3,Q,2.3340
1,4,B,1.2225
0,5,B,0.5864
0,6,Q,3.1459
0,7,Q,0.6587
1,8,C,0.2155
1,9,B,0.8465
0,10,Q,1.5573
0,11,C,0.5942
1,12,Q,4.0000
0,13,B,0.0001
1,14,C,0.2245
1,15,B,3.3315
0,16,Q,2.1854
0,17,B,1.9874

Extraer columnas de un archivo

Podemos seleccionar que columnas extraer de un archivo sólo indicando su número

extracols.awk 

#!/bin/awk -f
BEGIN {FS="," 
	   OFS=","}       # Begin section
{print $2,$4 }        # Loop section
END{}                 # End section

Llamamos el script como: $ awk -f extracols.awk file1.csv > outfile.csv

outfile.csv

col2,col4
1,0.1594
2,1.0264
3,2.3340
4,1.2225
5,0.5864
6,3.1459
7,0.6587
8,0.2155
9,0.8465
10,1.5573
11,0.5942
12,4.0000
13,0.0001
14,0.2245
15,3.3315
16,2.1854
17,1.9874

Reordenar columnas de un archivo

reorder.awk

#!/bin/awk -f
BEGIN {FS=","
	   OFS=","}  # Begin section
{print $2,$1,$3,$4 }# Loop section
  5 END{}        # End section

Corremos el script con el comando $ awk -f reorder.awk file1.csv > outfile.csv

El resultado es:

outfile.csv

col2,col1,col3,col4
1,1,B,0.1594
2,0,B,1.0264
3,1,Q,2.3340
4,1,B,1.2225
5,0,B,0.5864
6,0,Q,3.1459
7,0,Q,0.6587
8,1,C,0.2155
9,1,B,0.8465
10,0,Q,1.5573
11,0,C,0.5942
12,1,Q,4.0000
13,0,B,0.0001
14,1,C,0.2245
15,1,B,3.3315
16,0,Q,2.1854
17,0,B,1.9874

Combinar columnas extraídas de dos archivos en uno

Muchas veces queremos de dos archivos grandes generar uno sólo con el conjunto de columnas (sin filtrar u ordenar, eso lo veremos después) Para esto vamos a usar el comando paste que une los orchivos línea por línea El archivo file2.csv tiene que tener el mismo número de líneas que el archivo file1.csv.

file2.csv

col21,col22,col23
4,R,00384
1,R,01654
3,F,00187
3,R,00325
2,R,02551
2,R,04483
1,F,01250
2,R,04018
2,R,02560
3,R,03554
4,F,00882
2,R,04221
3,R,03210
1,F,01420
4,R,04449
1,F,00940
2,F,01872

la sintaxis es: $ paste -d',' file1.csv file2.csv > output.csv

Y el resultado es:

output.csv

col1,col2,col3,col4,col21,col22,col23
1,1,B,0.1594,4,R,00384
0,2,B,1.0264,1,R,01654
1,3,Q,2.3340,3,F,00187
1,4,B,1.2225,3,R,00325
0,5,B,0.5864,2,R,02551
0,6,Q,3.1459,2,R,04483
0,7,Q,0.6587,1,F,01250
1,8,C,0.2155,2,R,04018
1,9,B,0.8465,2,R,02560
0,10,Q,1.5573,3,R,03554
0,11,C,0.5942,4,F,00882
1,12,Q,4.0000,2,R,04221
0,13,B,0.0001,3,R,03210
1,14,C,0.2245,1,F,01420
1,15,B,3.3315,4,R,04449
0,16,Q,2.1854,1,F,00940
0,17,B,1.9874,2,F,01872