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:
- Extraer columnas de un archivo
- Reordenar columnas de un archivo
- Combinar columnas extraídas de dos archivos en uno
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