# rm-rf.es

Usar variables de shell en un script awk

Cuando utilizamos awk dentro de un script en shell o desde la línea de comandos, es común incluir variables de shell dentro del cuerpo del comando awk. Si lo hacemos del modo «tradicional», puede ocurrir lo siguiente:

Tenemos un archivo de texto muy sencillo, simplemente contiene varias columnas con números:

$ cat test.txt 
5555 763 923 1 234

Podemos mostrar únicamente la primera columna usando awk:

$ awk '{print $1}' test.txt 
5555

Si quisiéramos, por ejemplo, mostrar la primera columna pero únicamente si su valor numérico es superior a X, declarando X en una variable, de primeras lo intentaríamos hacer así:

$ LIMITE=500; awk '{print $1}' test.txt | awk '$1>$LIMITE'

¿Qué sucede? Nada, por salida estándar no sale nada y debería, pues el mínimo es 500 y la columna tiene un valor de 5555. El problema es que la última sentencia de awk no está aplicando el valor de la variable $LIMITE, no la reconoce.

Una de las formas correctas de declarar variables de shell dentro de awk es la siguiente:

$ LIMITE=500; awk '{print $1}' test.txt | awk -v limite="$LIMITE" '$1>limite'
5555

Ahora sí que está funcionando. Hemos utilizado el método que ofrece awk para asignamiento de variables de shell. Básicamente se asigna una variable a un patrón determinado, en este caso «limite» a la variable «$LIMITE»:

-v var=val		--assign=var=val

Otro ejemplo:

$ FOO="Esto es una prueba"; awk -v prueba="$FOO" 'BEGIN {print prueba}'
Esto es una prueba
Salir de la versión móvil