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.
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 dobleprecisión en punto flotante. Aquí se presentan algunos ejemplos de constantes numéricas, las cuales tienen todas el mismo valor:
105
1.05e+2
1050e1
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 8bits 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, controlg, código ASCII 7.
\b
Representa el retroceso o espacio atrás, controlh, código ASCII 8.
\f
Representa un formfeed, controll, código ASCII 12.
\n
Representa un carácter de nueva línea (newline), controlj, código ASCII 10.
\r
Representa un retorno de carro, controlm, código ASCII 13.
\t
Representa un tabulador horizontal, controli, código ASCII 9.
\v
Representa un tabulador vertical, controlk, 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.
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 (Builtin)
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.
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 inventarioenviado n=2 ListaBBS
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 inventarioenviado. 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 ListaBBS.
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 (Builtin).
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 }' inventarioenviado
Los operadores aritméticos en awk son:
x + y
Suma.
x y
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 ‘^’.
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 }' ListaBBS
produce, para el primer registro en `ListaBBS':
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 }' ListaBBS
produce, para el primer registro en `ListaBBS':
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 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 !~
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 ListaBBS que contengan 2400 o foo o ambos.
awk '{ if ($0 ~ /2400/ ¦¦ $0 ~ /foo/) print }' ListaBBS
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 ListaBBS que no contengan la cadena foo.
awk '{ if (! ($0 ~ /foo/)) print }' ListaBBS
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.
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 preincrementar 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 postincremento. 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 postincremento 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 predecremento
o después para un postdecremento.
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.
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 (Builtin).
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 (Builtin).
Los números son convertidos usando una versión especial
de la función sprintf (Ver la
sección 11.
Funciones Implícitas (Builtin)) 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.
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 ? iftrueexp : iffalseexp
Existen tres subexpresiones. La primera, selector, es siempre tratada primero. Si es cierta (distinta
de cero) entonces se procesa la expresión iftrueexp y su valor se convierte en el
valor de la expresión completa. Si no, iffalseexp 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 iftrueexp o iffalseexp, 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.
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 (builtin),
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 (Builtin),
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 (Builtin), 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) }'
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
$.
Manual |