8. Acciones: Expresiones

Las expresiones son los bloques de construcción básicos de las acciones awk. Una expresión se evalua a un valor, el cual puedes imprimir, testear, almacenar en una variable o pasar a una función.

Pero, más allá de eso, una expresión le puede asignar un nuevo valor a una variables o un campo, con un operador de asignación. Una expresión puede servir como una sentencia en si misma. La mayoría de los otros tipos de sentencias contienen una o más expresiones las cuales especifican los datos sobre los que se van a operar. Al igual que en otros lenguajes, las expresiones en awk incluyen variables, referencias a arrays, constantes, y llamadas a función, al igual que combinaciones de estas con varios operadores.

Expresiones Constantes

El tipo de expresión más simple es la constante, la cual tiene siempre el mismo valor. Existen tres tipos de constantes: constantes numéricas, constantes de cadenas, y constantes de expresiones regulares.

Una constante numérica representa un número. Este número puede ser un entero, una fracción decimal, o un número en notación científica (exponencial). Dese cuenta que todos los valores numéricos están representados en awk como doble–precisión en punto flotante. Aquí se presentan algunos ejemplos de constantes numéricas, las cuales tienen todas el mismo valor:

105

1.05e+2

1050e–1

Una constante cadena consiste en una secuencia de caracteres encerrados entre dobles comillas. Por ejemplo:

"loro"

representa la cadena cuyo contenido es ‘loro’. Las cadenas en gawk pueden ser de cualquier longitud y pueden contener cualquier carácter ASCII de 8–bits incluído el ASCII NUL. Otras implementaciones de awk podrían tener dificultad con algunos códigos de carácter.

Algunos caracteres no pueden ser incluídos literalmente en una constante cadena. Las representas en su lugar con secuencias de escape, las cuales son secuencias de caracteres que empiezan con una barra invertida (‘\’). Uno de los usos de una secuencia de escape es incluir un carácter de doble comillado en una constante cadena. Ya que un simple comilla doble representaría el final de la cadena, debes usar ‘\’ para representar un carácter de doble comilla como parte de la cadena. El mismo carácter de barra invertida es otro carácter que no puede ser incluído normalmente, debes escribir ‘\\’ para incluir este carácter en una cadena. Por lo que, la cadena cuyo contenido son los dos caracteres ‘”\’ debería ser escrita “\”\\”. Otro uso de la barra invertida es para representar caracteres no imprimibles como el newline. Aquí tienes una tabla de todas las secuencias de escape usadas en awk:

\\

Representa una barra invertida literal, ‘\’.

\a

Representa el carácter “alerta”, control–g, código ASCII 7.

\b

Representa el retroceso o espacio atrás, control–h, código ASCII 8.

\f

Representa un formfeed, control–l, código ASCII 12.

\n

Representa un carácter de nueva línea (newline), control–j, código ASCII 10.

\r

Representa un retorno de carro, control–m, código ASCII 13.

\t

Representa un tabulador horizontal, control–i, código ASCII 9.

\v

Representa un tabulador vertical, control–k, código ASCII 11.

\nnn

Representa el valor octal nnn, donde nnn son tres dígitos comprendidos entre 0 y 7. Por ejemplo, el código para el valor del carácter ASCII ESC (escape) es ‘\033’.

\xhh...

Representa el valor hexadecimal hh, donce hh son dígitos hexadecimales (desde ‘0’ a ‘9’ y desde ‘A’ a ‘F’ o desde ‘a’ a ‘f’) Al igual que la misma construcción en el ANSI C, la secuencia escape continúa hasta que se encuentra el primer dígito no hexadecimal. Sin embargo, el uso de más de dos dígitos hexadecimales produce resultados indefinidos.

Una expresión regular constante es una descripción de expresión regular encerrada entre barras, tal y como /^comienzo y fin$/. La mayoría de las expresiones regulares usadas en los programas awk son constantes, pero los operadores ‘~’ y ‘!~’ pueden también encajar con expresiones regulares computadas o “dinámicas” (Ver la sección Cómo usar Expresiones Regulares).

Las expresiones regulares constantes son útiles sólo con los operadores ‘~’ y ‘!~’; no las puedes asignar a variables o imprimirlas. Ellas no son expresiones realmente en el sentido estricto de la palabra.

Variables

Las variables te permiten darle un nombre a los valores y referirte a ellos posteriormente. Ya has visto variables en muchos de los ejemplos. El nombre de una variable debe ser una secuencia de letras, dígitos y subrayados, pero no pueden empezar con un dígito. Se hace distinción entre mayúsculas y minúsculas en los nombres de las variables, la variable a es distinta de la variable A.

Un nombre de variable es una expresión válida en si misma, representa el valor actual de la variable. Las variables reciben valores nuevos con los operadores de asignación y operadores incrementales. Ver la sección Expresiones de Asignación.

Unas pocas variables tienen significados implícitos especiales, tal y como FS, el separador de campo, y NF, el número de campos en el registro de entrada actual. Ver la sección 13. Variables Implícitas (Built–in) para ver una lista de las mismas. Estas variables implícitas pueden ser usadas y asignadas como cuales quiera otras variables, pero sus valores son también usados o cambiados automáticamente por awk. Todos los nombre de variables implícitas están formados por letras mayúsculas.

A las variables en awk se les puede asignar valores numéricos o cadenas de texto. Por defecto, las variables son inicializadas a la cadena nula, la cual es un 0 cuando es convertida a número. Por lo que no es necesario inicializar cada variable explícita en awk, del mismo modo que necesitarías hacerlo en C o en la mayoría de los lenguajes de programación tradicionales.

Asignación de Variables en la Línea de Comando

Puedes asignarle un valor a cualquier variable awk incluyendo una asignación de variable entre los argumentos en la línea de comando cuando invocas a awk (Ver la sección 14. Invocación de awk). Tal asignación presenta la siguiente forma:

variable =text

Con ello, puedes darle un valor a una variable al principio de la ejecución de awk o entre el procesamiento de los ficheros de entrada.

Si precedes la asignación con la opción ‘–v’, tal y como esto:

–v variable=text

entonces la variable toma su valor al principio, antes incluso de que se ejecuten las reglas BEGIN. La opción ‘–v’ y su asignación debe preceder todos los argumentos de nombres de ficheros.

De otro modo, la asignación a variable se realiza en un momento determinado por su posición entre los argumentos nombre de fichero: después del procesamiento del argumento fichero de entrada precedente. Por ejemplo:

awk '{ print $n }' n=4 inventario–enviado n=2 Lista–BBS

imprime el valor del campo n para todos los registros de entrada. Antes de que se lea el primer fichero, la línea de comando fija el valor de la variable n a 4. Esto causa que se imprima el campo cuarto de todos los registros del fichero ‘inventario–enviado’. Después de acabar con el primer fichero, pero antes de que se comience con el segundo, n toma el valor de 2, de forma que se imprime el segundo campo de todas las líneas del fichero ‘Lista–BBS’.

Los argumentos de la línea de comando son puestos a disposición de awk para una examinación explícita en el array llamado ARGV (Ver la sección 12. Variables Implícitas (Built–in).

Operadores Aritméticos

El lenguaje awk utiliza los operadores aritméticos comunes cuando se evalúan expresiones. Todos estos operadores aritméticos siguen las reglas de precedencia normales, y se comportan como se podría esperar de ellos. Este ejemplo divide el campo tercero entre el campo cuarto y el resultado lo suma al campo dos, almacenando el resultado en el campo uno, e imprime el registro de entrada alterado:

awk '{ $1 = $2 + $3 / $4; print }' inventario–enviado

Los operadores aritméticos en awk son:

x + y

Suma.

xy

Resta.

x

Negación.

x * y

Multiplicación

x / y

División. Ya que todos los números en awk son puntos flotante de doble precisión, el resultado no se redondea a entero: 3 / 4 tiene el valor 0.75.

x % y

Resto. El cociente se redondea a cero o a un entero, se multiplica por y y este resultado se le resta a x. La siguiente relación siempre se cumple:

b * int(a / b) + (a % b) == a

Otro efecto indeseable de esta definición de resto es que x%y sea negativo si x es negativo. Por lo que,

–17 % 8 = –1

En otras implementaciones awk, la falta de signo del resto puede ser dependiente de la máquina.

x ^ y

x ** y

Exponenciación: x elevado a la potencia de y. 2 ^ 3 tiene el valor 8. La secuencia de caracteres ‘**’ es equivalente al carácter ‘^’.

Concatenación de Cadenas

Existe una única operación con cadenas: la concatenación. No tiene un operador específico para representarla. En su lugar, la concatenación se realiza escribiendo expresiones unas al lado de las otras, sin operador. Por ejemplo:

awk '{ print "Campo número uno: " $1 }' Lista–BBS

produce, para el primer registro en `Lista–BBS':

Campo número uno: aardvark

Sin el espacio en la cadena constante después de los dos puntos ‘:’, la línea hubiese aparecido junta. Por ejemplo:

awk '{ print "Campo número uno:" $1 }' Lista–BBS

produce, para el primer registro en `Lista–BBS':

Campo número uno:aardvark

Ya que la concatenación de cadenas no tiene un operador explícito, es necesario a menudo asegurarse que ocurre donde la quieres encerrando los items a ser concatenados en paréntesis. Por ejemplo, el siguiente fragmento de código no concatena fichero y nombre como podrías esperar:

file = "fichero"

name = "nombre"

print "algo útil" > file name

Es necesario usar lo siguiente:

print "algo útil" > (file name)

Recomendamos que uses los paréntesis alrededor de la concatenación en al menos todos los contextos más comunes (tal y como en la parte derecha del operador ‘=’).

Expresiones de Comparación

Expresiones de comparación comparan cadenas o números para relaciones tales como la igualdad. Se escriben usando operadores relacionales, los cuales son un superconjunto de los de C. Aquí tienes una tabla de ellos:

x < y

Verdad si x es menor que y.

x <= y

Verdad si x es menor o igual que y.

x > y

Verdad si x es mayor que y.

x >= y

Verdad si x es mayor o igual que y.

x == y

Verdad si x es igual a y.

x != y

Verdad si x no es igual a y.

x ~ y

Verdad si la cadena x encaja con la expresion regular representada por y.

x !~ y

Verdad si la cadena x no encaja con la expresión regular representada por y.

subíndice in array

Verdad si el array array tiene un elemento con el subíndice subíndice.

La expresiones de comparación tienen el  valor 1 si son ciertas y 0 sin son falsas.

Los operandos de un operador relacional son comparados como números si ambos son números. Sino, son convertidos y comparados como cadenas (Ver la sección Conversiones de Cadenas y Números).

Las cadenas son comparadas comparando el primer carácter de cada una, después el segundo carácter de cada una, y así sucesivamente. Por lo que, “10” es menor que “9”.

Por ejemplo,

$1 == "foo"

tiene el valor de 1, o es cierto, si el primer campo del registro de entrada actual es precisamente ‘foo’. En contraposición,

$1 ~ /foo/

tiene el valor 1 si el primer campo contiene ‘foo’.

La parte derecha de los operadores ‘~’ y ‘!~’ podría ser una expresión regular constante (/…/) o una expresión ordinaria, en cuyo caso el valor de la expresión como una cadena es una expresión regular dinámica (Ver la sección Cómo usar Expresiones Regulares)

En implementaciones de awk muy recientes, una expresión regular constante entre barras por si misma es también una expresión. La expresión regular /expreg/ es una abreviación de esta expresión de comparación:

$0 ~ /expreg/

En algunos contextos podría ser necesario escribir paréntesis alrededor de la expresión regular para evitar confundir al analizador de sentencias de awk. Por ejemplo, (/x/ – /y/) > umbral no está permitido, pero ((/x/) – (/y/)) > umbral si es aceptado por el analizador de sentencias.

Un sitio especial donde /foo/ no es una abreviación de $0 ~ /foo/ es cuando es el operador de la derecha de ‘~’ o ‘!~’

Expresiones Booleanas

Una expresión booleana es una combinación de expresiones de comparación o expresiones matching, usando los operadores booleanos "o" (‘¦¦’), "y" (`&&'), y "not" (‘!’), usando los paréntesis para controlar el anidamiento. La veracidad de la expresión booleana se calcula combinando la veracidad de las expresiones que la componen.

Las expresiones booleanas pueden ser usadas en cualquier lugar donde puedas usar una expresión de comparación o matching. Pueden ser usadas en sentencias if y while. Tienen valores numéricos (1 si es cierto, 0 si es falso), cuando el resultado de la expresión booleana se almacena en una variable, o usada en aritmética.

Además, toda expresión booleana es también un patrón booleano válido, por lo que puedes usarla como un patrón para controlar la ejecución de reglas.

Aquí están las descripciones de los tres operadores booleanos, con un ejemplo de cada uno. Podría ser instructivo comparar estos ejemplos con los ejemplos análogos de patrones booleanos (Ver la sección Operadores Booleanos como Patrones) los cuales usan los mismos operadores booleanos en patrones en lugar de expresiones.

booleana1 && booleana2

Verdad si tanto booleana1 como booleana2 son ciertas. Por ejemplo, la siguiente sentencia imprime el registro actual si contiene ‘2400’ y ‘foo’.

if ($0 ~ /2400/ && $0 ~ /foo/) print

La subexpresión booleana2 se evalúa solamente si la expresión booleana1 es cierta. Esto puede implicar una distinción cuando booleana2 contiene expresiones que tienen efectos laterales: en el caso de $0 ~ /foo/ && ($2 == bar++),la variable bar no se incrementa si no aparece primeramente ‘foo’ en el registro.

booleana1 ¦¦ booleana2

Esto es cierto si al menos una de las dos, o booleana1 o booleana2, es cierta. Por ejemplo, el siguiente comando imprime todos los registro del fichero de entrada ‘Lista–BBS’ que contengan ‘2400’ o ‘foo’ o ambos.

awk '{ if ($0 ~ /2400/ ¦¦ $0 ~ /foo/) print }' Lista–BBS

La subexpresión booleana2 se evalúa solamente si la expresión booleana1 es falsa. Esto debe ser tenido en cuenta cuando booleana2 contiene expresiones que tienen efectos laterales.

!booleana

Verdad si booleana es falsa. Por ejemplo, el siguiente programa imprime todos los registros del fichero de entrada ‘Lista–BBS’ que no contengan la cadena ‘foo’.

awk '{ if (! ($0 ~ /foo/)) print }' Lista–BBS

Expresiones de Asignación

Una asignación es una expresión que almacena un valor nuevo en una variable. Por ejemplo, asignemos el valor 1 a la variable z.

z = 1

Después de que esta expresión se haya ejecutado, la variable z tiene el valor 1. Cualquier valor anterior que tuviese z antes de la asignación se pierde.

Las asignaciones pueden almacenar valores tipo cadena también. Por ejemplo, esto almacenaría el valor “esta comida es buena” en la variable mensaje.

cosa = "comida"

predicado = "buena"

mensaje = "esta " cosa " es " predicado

(Este ejemplo además ilustra una concatenación de cadenas).

Al signo ‘=’ se le llama operador asignación. Es el operador de asignación más simple porque el valor del operando que se encuenta a la derecha permanece invariable.

La mayoría de los operadores (adición, concatenación, etc.) no tienen ningún efecto para computar un valor. Si ignoras el valor, podrías también no usar el operador. Un operador de asignación es diferente, produce un valor, pero incluso si ignoras el valor, la asignación todavía se realiza. Se llama a esto efecto lateral.

El operando a la izquierda de la asignación no tiene porqué ser una variable (Ver la sección Variables); también podría ser un campo (Ver la sección Cambiando los contenidos de un campo) o el elemento de un array (Ver la sección 9. Arrays en awk). Estos son llamados valoresi, lo cual significa que pueden aparecer en la parte izquierda de un operador de asignación. El operando de la derecha podría ser una expresión; produce el número valor que la asignación almacena en la variable, campo o elemento de array especificado.

Es importante señalar que las variables no tienen tipos de datos permanentes. El tipo de una variable es simplemente el tipo del valor que almacena la variable en ese momento. En el siguiente fragmento de programa, la variable foo tiene un valor numérico primero y un valor cadena después:

foo = 1

print foo

foo = "bar"

print foo

Cuando la segunda asignación le da a la variable foo un valor cadena, el hecho de que esta variable almacenase previamente un valor numérico es olvidado.

La asignación es una expresión, de forma que tiene un valor: el mismo valor que es asignado. Por lo que, z = 1 como expresión tiene el valor 1. Una consecuencia de esto es que puedes escribir asignaciones múltiples juntas:

x = y = z = 0

almacena el valor 0 en las tres variables. Hace esto porque el valor de z = 0, es cual es 0, se almacena en y, y el valor de y = z = 0, que es 0, se almacena en x.

Puedes usar una asignación en cualquier lugar en el que se pueda llamar a una expresión. Por ejemplo, es válido escribir x != (y = 1) para darle a y el valor 1 y posteriormente chequear si x es igual a 1. Pero este estilo tiende a crear programas difíciles de leer.

Además de ‘=’, existen otras diversos operadores de asignación que realizan una operación aritmética con el valor antiguo de la variable. Por ejemplo, el operador ‘+=’ calcula un nuevo valor para la variable añadiendo el valor de la derecha al valor antiguo de la variable. Por lo que, la siguiente asignación añade 5 a la variable de ‘foo’:

foo += 5

Esto es precisamente equivalente a:

foo = foo + 5

usa el que haga que tu programa sea más claro.

Aquí tienes una tabla de operadores de asignación aritméticos. En todos los casos, el operando de la derecha es una expresión cuyo valor se convierte a número.

valori += incremento

Añade incremento al valor de valori para obtener el nuevo valor a asignar a valori.

valori –= decremento

Substrae decremento del valor de valori.

valori *= coeficiente

Multiplica el valor de valori por coeficiente.

valori /= coeficiente

Divide el valor de valori entre coeficiente.

valori %= módulo

Le asigna a valori el resto de la división entre modulo.

valori ^= potencia

valori **= potencia

Eleva a valori a la potencia de potencia.

Operadores Incrementales

            Los Operadores incrementales incrementan o decrementa el valor de una variable en 1. Podrías hacer lo mismo con un operador de asignación, de forma que los operadores incrementales no añaden potencia al lenguaje awk; pero añaden una abreviación conveniente para algo muy común.

            El operador para añadir 1 se escribe ‘++’. Puede ser usado para incrementar una variable antes o después de coger su valor.

Para pre–incrementar una variable v, escribe ++v. Esto añade 1 al valor de v y ese nuevo valor es también el valor de esta expresión. La expresión de asignación v += 1 es completamente equivalente.

La escritura de ‘++’ después de la variable especifica un post–incremento. Esto incrementa la variable de igual manera; la diferencia es que el valor de la expresión de incremento por si misma es el viejo valor de la variable (antes de ser incrementada). Por lo que, si foo tiene un valor de 4, entonces la expresión foo++ tiene el valor de 4, pero cambia el valor de la variable foo a 5.

El post–incremento foo++ es aproximadamente equivalente a escribir (foo += 1) – 1. No es perfectamente equivalente porque todos los números en awk son punto flotante: en punto flotante, foo +1 – 1 no es necesariamente igual a foo. Pero la diferencia es mínima mientras lo uses con números que sean pequeños (menores a un trillón).

Cualquier valori puede ser incrementado. Los campos y los elementos de array pueden ser incrementados del mismo modo que las variables.

El operador decremento ‘––’ funciona del mismo modo que el ‘++’ excepto que lo que hace es restar 1 en lugar de añadirlo. Al igual que el operador ‘++’, puede ser usado antes del valori para un pre–decremento o después para un post–decremento.

Aquí tienes un sumario de las expresiones de incremento y decremento.

++valori

Esta expresión incrementa valori y el nuevo valor se convierte en el valor de la expresión.

valori++

Esta expresión hace que se incremente el valor de valori.. El valor de la expresión es el valor antiguo de valori.

––valori

Como ++valori, pero en lugar de adición, substrae. Decrementa el valor de valori y devuelve dicho valor como resultado de la expresión.

valori––

Como valori++, pero en lugar de añadir, substrae. Decrementa valori. El valor de la expresión es el valor antiguo de valori.

Conversiones de Cadenas y Números

Las cadenas son convertidas a números, y los números a cadenas, si el contexto del programa awk lo requiere. Por ejemplo, si el valor de la variable foo o la variable bar en la expresión foo + bar es una cadena, dicho valor es convertido a número antes de que se realice la suma. Si aparecen valores numéricos en una concatenación de cadenas, son convertidos a cadenas. Considere esto:

two = 2; three = 3

print (two three) + 4

Esto imprime eventualmente el valor (numérico) 27. Los valores numéricos de las variables two y three son convertidos a cadenas y concatenados juntos, y el resultado de la concatenación se convierte a número, resultando el número 23, al cual se le añade el número 4.

Si ,por alguna razón, necesitas forzar la conversión de un número a cadena, concaténa la cadena nula con dicho número. Para forzar que una cadena sea convertida a número, súmale cero a esa cadena.

Las cadenas son convertidas a números mediante su interpretación como números: "2.5" se convierte en 2.5, y "1e3" se convierte en 1000 (notación científica). Las cadenas que no pueden ser interpretadas como números válidos son convertidas a cero.

La forma exacta que se usa para convertir números en cadenas es controlada por la variable implícita OFMT (Ver la sección 12. Variables Implícitas (Built–in).

La manera exacta en la que los números son convertidos en cadenas está controlada por la variable implícita de awk OFMT (Ver la sección 12. Variables Implícitas (Built–in). Los números son convertidos usando una versión especial de la función sprintf (Ver la sección 11. Funciones Implícitas (Built–in)) con OFMT como especificador de formato.

El valor por defecto de OFMT es "%.6g", el cual imprime un valor con al menos seis dígitos significativos. Para algunas aplicaciones querrás cambiar este valor para obtener una precisión mayor. “Double precision” en la mayoría de las máquinas modernas te da 16 o 17 dígitos decimales de precisión.

Podrían darse resultados extraños si le das a OFMT un valor o cadena especificadora de formato que no le indique correctamente a sprintf como formatear números en punto flotante de una forma correcta. Por ejemplo, si olvidas el ‘%’ en el formato, todos los números serán convertidos a la misma cadena constante.

Expresiones Condicionales

Una expresión condicional es un tipo especial de expresión con tres operandos. Te permite usar el valor de una expresión para seleccionar una expresión de entre otras dos posibles.

La expresión condicional presenta el mismo formato que en el Lenguaje C:

selector ? if–true–exp : if–false–exp

Existen tres subexpresiones. La primera, selector, es siempre tratada primero. Si es “cierta” (distinta de cero) entonces se procesa la expresión if–true–exp y su valor se convierte en el valor de la expresión completa. Si no, if–false–exp es procesada y su valor es el que se convierte en el valor de la expresión completa.

Por ejemplo, esta expresión produce el valor absoluto de x:

x > 0 ? x : –x

Cada vez que la expresión condicional se procesa, se ejecuta siempre una de las dos expresiónes if–true–exp o if–false–exp, la otra es ignorada. Esto es importante cuando las expresiones contienen efectos laterales. Por ejemplo, esta expresión condicional examina el elemento i de el array a o del array b, y a continuación lo incrementa.

x == y ? a[i++] : b[i++]

Esto garantiza que se incrementa i exactamente una vez, porque cada vez se ejecuta o uno u otro incremento y el otro no.

Llamadas a Funciones

Una función es un nombre para un cálculo particular. Debido a que tiene un nombre, puedes llamarla por dicho nombre en cualquier punto de un programa. Por ejemplo, la función sqrt calcula la raíz cuadrada de un número.

Un conjunto fijo de funciones son implícitas (built–in), lo que significa que están disponibles en cualquier programa de awk. La función sqrt es una de estas. Ver la sección 11. Funciones Implícitas (Built–in), para una lista de funciones implícitas y sus descripciones. Además de éstas funciones, puedes definir tus propias funciones en el programa para usar en cualquier punto dentro del mismo programa. Ver la sección 11. Funciones definidas por el Usuario, para conocer como hacer esto.

La forma de utilizar una función es con una expresión de llamada a función, la cuál consiste en el nombre de la función seguido de una lista de argumentos entre paréntesis. Los argumentos son expresiones las cuales le proporcionan los valores a la función para que ésta realice sus cálculos u operaciones. Cuando existen más de un argumento, éstos estarán separados por comas. Si la función no necesita argumentos, escribe simplemente ‘()’ detrás del nombre de la función. Aquí tienes algunos ejemplos:

sqrt(x**2 + y**2)    # One argument

atan2(y, x)          # Two arguments

rand()               # No arguments

¡No pongas ningún espacio en blanco entre el nombre de la función y el paréntesis de apertura!. Una función definida por el usuario es similar al nombre de una variable, y un espacio produciría que la expresión pareciese la concatenación de un variable con una expresión encerrada entre paréntesis (argumentos de la función). Por lo que sería bueno acostumbrarse a no dejar espacios en blanco entre los nombres de funciones (definidas por el usuario o implícitas) y los paréntesis con los argumentos.

Cada función espera un número concreto de argumentos. Por ejemplo, la función sqrt debe ser llamada con un único argumento, el número del que se va a obtener la raíz cuadrada.

sqrt(argument)

Algunas de las funciones implícitas te permiten omitir el argumento final. Si haces esto, estas funciones realizan algo razonable por defecto. Ver la sección 11. Funciones Implícitas (Built–in), para detalles sobre esto. Si se omiten argumentos en llamadas a funciones definidas por el usuario, entonces esos argumentos son tratados como variables locales, inicializadas a la cadena nula (Ver la sección 12. Funciones definidas por el Usuario).

Al igual que otras muchas expresiones, la llamada a función tiene un valor, el cual es calculado por la función basándose en los argumentos que le pasas. En este ejemplo, el valor de sqrt(argumento) es la raíz cuadrada del argumento. Una función también puede tener efectos laterales, tales como asignar el valor de ciertas variables o hacer Entrada/Salida. Aquí está un comando para leer números, un número por línea, e imprime la raíz cuadrada de cada uno:

awk '{ print "La raíz cuadrada de ", $1, " es ", sqrt($1) }'

Precedencias de Operadores: Cómo se anidan los Operadores

            La precedencia de operadores determina como se agrupan los mismos, cuando aparecen distintos operadores cerca unos de otros en una expresión. Por ejemplo, ‘*’ tiene mayor precedencia que ‘+’; por lo que a +b * c significa que hay que multiplicar b * c y el resultado sumárselo a a.

            Puedes saltarte la precedencia de operadores mediante los paréntesis. De hecho, es conveniente usar paréntesis donde quiera que tengas una combinación de operadores inusual, porque otras personas que lean el programa podrían no recordar cuál es la precedencia en ese caso. Tú mismo también podrías olvidarla; por lo que podrías cometer un fallo. Los paréntesis explícitos te prevendrán de tales errores.

            Cuando se usan juntos operadores de igual precedencia, el operador más a la izquierda es el que tiene la precedencia, a excepción de la asignación, y operadores condicionales y exponenciales, los cuales se agrupan en el orden contrario. Por lo que, a – b + c se agrupa de la siguiente forma (a – b) + c; a = b = c se agrupa  a = (b = c).

            La precedencia de operadores unarios prefijo no importa ya que solo se ven implicados los operadores unarios, porque solo hay una forma de hacerles el parse – el más interno primero. Por lo que, $++i significa $(++i) y ++$x significa ++($x). Sin embargo, cuando otro operador sigue al operando, entonces la precedencia de los operadores unarios puede presentar problemas. Por lo que, $x**2 es lo mismo que ($x)**2, pero –x**2 significa –(x**2), porque ‘–’ tiene menor precedencia que `**' mientras que `$' tiene una mayor precedencia.

Aquí tienes una lista de operadores de awk, en orden de precedencia creciente:

Asignación

‘=’, ‘+=’, ‘–=’, ‘*=’, ‘/=’, ‘%=’, ‘^=’, ‘**=’. Estos operadores se agrupan de derecha a izquierda.

Condicional

`?:'. Estos operadores se agrupan de derecha a izquierda.

“o” lógico.

‘¦¦’.

“y” lógico .

‘&&’.

Pertenencia a array

in.

Encaje o patrón

‘~’, ‘!~’.

Relacional y redireccionamiento

Los operadores relacionales y las redirecciones tienen el mismo nivel de precedencia. Caracteres tales como ‘>’ sirven tanto como relacionales como de redireccinamiento; el contexto hace que se diferencie entre los dos significados.

Los operadores relacionales son ‘<’, ‘<=’, ‘==’, ‘!=’, ‘>=’ y ‘>’.

Los operadores de redireccionamiento de la Entrada/Salida son ‘<’, ‘>’, ‘>>’ y ‘¦’.

Anotar que los operadores de redireccionamiento de la Entrada/Salida en las sentencias print y printf pertenecen al nivel de sentencia, no a las expresiones. El redireccionamiento no produce una expresión la cual podría ser el operando de otro operador. Como resultado de esto, no tendría sentido usar un operador de redirección cerca de otro operador de precedencia menor, sin paréntesis. Tales combinaciones, por ejemplo ‘print foo > a ? b : c’, produce un error de sintaxis.

Concatenación

No se usa ningún token especial para indicar la concatenación. Los operandos son escritos simplemente uno al lado de otro (con un espacio en medio de ambos).

Adición, sustración

‘+’, ‘–’.

Multiplicación, división y módulo

‘*’, ‘/’, ‘%’.

Más y menos unario, "not"

‘+’, ‘–’, ‘!’.

Exponenciación

‘^’, ‘**’. Estos operadores se agrupan de derecha a izquierda.

Incremento, decremento

‘++’, ‘––’.

Campo

‘$’.

   
Índice
Manual