11. Funciones Implícitas (Built-in)

Las funciones implícitas (Built-in) son funciones que están siempre disponibles para ser llamadas por tu programa awk. Este capítulo define todas las funciones implícitas de awk; algunas de ellas son mencionadas en otras secciones, pero ellas son recogidas aquí para tu conveniencia. (También se pueden crear funciones definidas por uno mismo. Ver sección Funciones definidas por el usuario)

Llamada a funciones implícitas (Built-in)

Para llamar a una función implícita, escribe el nombre de la función seguida por sus argumentos en paréntesis. Por ejemplo, atan2(y+z,1) es una llamada a la función atan2, con dos argumentos.

Los espacios en blanco entre el nombre de la función y los paréntesis son ignorados, pero se recomienda evitar poner espacios entre el nombre de la función y el paréntesis. Las funciones definidas por el usuario no pueden ser llamadas poniendo espacios en blanco entre el nombre de la función y el paréntesis, y te será más útil tomar el criterio de no poner espacios en blanco para cualquier tipo de llamada a función: no dejar espacios en blanco detrás de un nombre de función.

Cada función implícita acepta un cierto número de argumentos. En la mayoría de los casos, cualquier argumento extra que se le pase a la función implícita es ignorado. Los valores por defecto para argumentos omitidos varían de una función a otra y son descritos en cada una de las funciones.

Cuando se llama una función, las expresiones que crean los parámetros actuales de la función son evaluadas completamente antes de realizarse la llamada a la función. Por ejemplo, en el fragmento de código:

i = 4

j = sqrt(i++)

la variable i es fijada antes de que se produzca la llamada a la función sqrt, con un valor de 4 como parámetro actual.

Funciones Implícitas (Built-in) Numéricas

Aquí está una lista completa de funciones implícitas que trabajan con números:

int(x)

      Esto te da la parte entera de x, truncado hacia 0. Esto produce el entero más cercado a x, localizado entre x y 0.

      Por ejemplo, int(3) es 3, int(3.9) es 3, int(-3.9) es -3, y int(-3) es -3 también.

sqrt(x)

      Esto te da la raíz cuadrada positiva de x. Devuelve un error si x es un número negativo. Por lo tanto sqrt(4) es 2.

exp(x)

      Esto te da el exponencial de x, o reporta un error si x está fuera de rango. Los rangos del valor x puede tener dependencias de la representación de los números flotante de tu máquina.

log(x)

      Esto te da el logaritmo natural de x, si x es positivo; sino, devuelve un error.

sin(x)

      Esta función te devuelve el seno de x, con x en radianes.

cos(x)

      Te devuelve el coseno de x, con x en radianes.

atan2(y, x)

      Esto te da el arcotangente de y/x, con el cociente entendido en radianes.

rand()

      Esta función te da un número aleatorio. Los valores de rand son distribuídos unifórmemente entre 0 y 1.

A menudo quieres enteros aleatorios en su lugar. Aquí está una función definida por el usuario que puedes usar para obtener un entero aleatorio no negativo menor que n:

function randint(n) {

     return int(n * rand())

}

      La multiplicación produce un número real aleatorio mayor que 0 y menor que n. Nosotros entonces lo convertimos a entero (usando int) entre 0 y n-1.

      Aquí tienes un ejemplo donde un función similar se usa para producir números enteros entre 1 y n:

awk '

# Function to roll a simulated die.

function roll(n) { return 1 + int(rand() * n) }

# Roll 3 six-sided dice and print total number of points.

{

      printf("%d points\n", roll(6)+roll(6)+roll(6))

}'

      Nota: rand comienza a generar números desde el mismo punto, o semilla, cada vez que tu ejecutas awk. Esto significa que un programa producirá los mismos resultados cada vez que los ejecutas. Los números son aleatorios dentro de una ejecución de awk, pero predecibles de una ejecución a otra. Esto es conveniente para la depuración, pero si quieres que un programa haga cosas diferentes cada vez que sea usado, debes cambiar la semilla a un valor que sea distinto cada vez que se ejecute. Para hacer esto, use srand.

srand(x)

      La función srand fija el punto de inicio, semilla, para la generación de números aleatorios al valor de x.

Cada valor de semilla lleva a una secuencia particular de números “aleatorios”. Por lo que, si fijas la semilla al mismo valor una segunda vez, obtendrás la misma secuencia de números “aleatorios” de nuevo.

      Si omites el argumento x, como en srand(), entonces la fecha y hora del día actuales son usados como semilla. Esta es la forma de obtener números aleatorios que sean realmente impredecibles.

El valor de retorno de srand es la semilla previa. Esto hace más fácil el seguimiento de las semillas para el uso en la reproducción consistente de secuencias de números aleatorios.

time()

      La función time (no presente en todas las versiones de awk) devuelve la hora actual en segundos desde el 1 de Enero de 1970.

ctime(then)

      La función ctime (no en todas las versiones de awk) toma un argumento numérico en segundos y devuelve una cadena que representa la fecha correspondiente, adecuada para impresión o un procesamiento posterior.

Funciones Implícitas (Built-in) para Manipulación de Cadenas

Las funciones en esta sección examinan el texto de una o más cadenas.

index(cadena, cad_buscar)

      Esto busca la primera ocurrencia de la cadena cad_buscar en la cadena cadena, y devuelve la posición donde se produce esa ocurrencia dentro de la cadena cadena. Por ejemplo:

awk 'BEGIN { print index("peanut", "an") }'

devuelve un `3'. Si no se encuentra cad_buscar, index devuelve un 0.

length(string)

      Esto te da el número de caracteres  de la cadena string. Si string es un número, la longitud de la cadena de dígitos que representa dicho número es devuelta. Por ejemplo, length(“abcde”) es 5. En contraste, length(15*35) devuelve 3, que es la longitud de la cadena que se corresponde con el número resultante (525).

Si no se le suministran argumentos, length devuelve la longitud de $0 (la línea completa).

match(string, regexp)

      La función match busca en la cadena, string, la más grande, y más a la izquierda subcadena que concuerde con la expresión regular, regexp. Devuelve la posición de carácter, o índice, de donce dicha subcadena empieza (1, si empieza al principio de string). Si no se encuentra una subcadena que concuerde con la expresión regular, regexp, devuelve un 0.

La función match fija la variable implícita RSTART al valor de índice. También fija la variable implícita RLENGTH a la longitud de la subcadena que concuerda con la expresión regular. Si no se encuentra ninguna coincidencia, RSTART es fijado a 0, y RLENGTH a –1.

Por ejemplo:

awk '{

       if ($1 == "FIND")

         regex = $2

       else {

         where = match($0, regex)

         if (where)

           print "La expresión regular ", regex, "encontrada en la posición ", where, "en ", $0

       }

}'

      Este programa busca las líneas que concuerdan con la expresión regular almacenada en la variable regex. Esta expresión regular puede ser cambiada. Si la primera palabra de la línea es ‘FIND’, regex se cambia a la segunda palabra de esa línea. Por lo tanto, dado:

FIND fo*bar

My program was a foobar

But none of it would doobar

FIND Melvin

JF+KM

This line is property of The Reality Engineering Co.

This file created by Melvin.

awk imprime:

La expresión regular fo*bar encontrada en posicion 18 en My program was a foobar

La expresión regular Melvin encontrada en posición 26 en This file created by Melvin.

split(string, array, fieldsep)

      Esto divide string en trozos separados por fieldsep, y almacena los trozos en array. El primer trozo se almacena en array[1], el segundo trozo en array[2], y así hasta el final. El valor cadena del tercer argumento, fieldsep, se utiliza como una expresión regular para buscar los sitios por los que particionar string. Si se omite el fieldsep, se utiliza el valor de FS. Split devuelve el número de elementos creados.

La función split, entonces, parte cadenas en trozos en una forma similar a la forma en la que las líneas de entrada son dividias en campos. Por ejemplo:

split("auto-da-fe", a, "-")

parte la cadena ‘auto-da-fe’ en tres campos usando ‘-‘ como separador. Fija los valores del array a tal y como sigue:

a[1] = "auto"

a[2] = "da"

a[3] = "fe"

el valor devuelto por esta llamada a la función split es 3.

sprintf(format, expression1,...)

      Esta función devuelve (sin imprimirla) la cadena que la función printf habría impreso utilizando los mismos argumentos (ver la sección Uso de sentencias printf para una impresión más elegante). Por ejemplo:

sprintf("pi = %.2f (aprox.)", 22/7)

devuelve la cadena "pi = 3.14 (aprox.)".

sub(regexp, replacement, target)

      La función sub altera el valor de target. Busca este valor, el cuál debería ser una cadena, en la subcadena más a la izquierda que concuerde con la expresión regular, regexp, extendiendo esta concordancia tan lejos como fuese posible. Entonces la cadena completa se cambia reemplazando el texto encajado por replacement. La cadena modificada se convierte en el nuevo valor de target.

Esta función es peculiar porque target no es simplemente usada para calcular un valor: debe ser una variable, campo o referencia de array, de forma que sub pueda almacenar un valor modificado en la misma. Si se omite este argumento, entonces por defecto es usar y alternar $0. Por ejemplo:

str = "water, water, everywhere"

sub(/at/, "ith", str)

fija str a "wither, water, everywhere", reemplazando la ocurrencia más a la izquierda y más larga de ‘at’ por ‘ith’.

      La función sub devuelve el número de substituciones hechas (o 1 o 0)

Si el carácter especial ‘&’ aparece en replacement, el mantiene la subcadena precisa que concordó con regexp. (Si la expresión regular expreg puede encajar con más de una cadena, entonces esta subcadena precisa podría variar.). Por ejemplo:

awk '{ sub(/candidate/, "& and his wife"); print }'

cambia la primera ocurrencia de ‘candidate’ a ‘candidate and his wife’ en cada línea de entrada.

      El efecto de este carácter especial puede ser desactivado poniendo una barra invertida antes de él en la cadena. Como es usual, para insertar una barra invertida en la cadena, debes escribir dos barras invertidas. Por lo tanto, escribe ‘\\&’ en una cadena constante para incluir un literal ‘&’ en el replacement. Por ejemplo, aquí tienes como reemplazar el primer ‘¦’ de cada línea por un ‘&’:

awk '{ sub(/\¦/, "\\&"); print }'

      Nota: como se mencionó anteriormente, el tercer argumento de sub debe ser un valori. Algunas versiones de awk permiten que el tercer argumento sea una expresión la cual no sea un valori. En tales casos, sub buscaría de todas formas el patrón y devolvería un 0 o un 1, pero el resultado de la substitución (si existiese) no sería tenido en cuenta porque no hay un lugar para colocarlo. Tales versiones de awk aceptas expresiones tales como esta:

sub(/USA/, "United States", "the USA and Canada")

      Pero esa es considerada erronea en gawk.

gsub(regexp, replacement, target)

      Esta es similar a la función sub, excepto que gsub reemplaza todas las concordancias que encuentre con la expresión regular, regexp (reemplaza varias concordancias en una misma línea o registro). El ‘g’ en gsub significa “global”, lo cual significa reemplazar en cualquier sitio. Por ejemplo:

awk '{ gsub(/Britain/, "United Kingdom"); print }'

reemplaza todas las ocurrencias de la cadena ‘Britain’ por ‘United Kingdom’ para todos los registros de entrada. La función gsub devuelve el número de substituciones realizadas. Si la variable a ser buscada y alterada, target, se omite, entonces se utiliza el registro de entrada completo, $0.

      Como en sub, los caracteres `&' y `\' son especiales, y el tercer argumento debe ser un valori.

substr(string, start, length)

      Esta función devuelve una subcadena de longitud length de string, empezando el el carácter número start. El primer carácter de una cadena es el carácter número 1. Por ejemplo, substr("washington", 5, 3) devuelve "ing".

      Si no se especifica length, esta función devuelve el sufijo completo de cadena que comienza en el carácter número start. Por ejemplo, substr("washington", 5) devuelve "ington".

tolower(string)

      Esto devuelve una copia de string, con cada carácter en mayúsculas de la cadena reemplazado por su correspondiente carácter en minúscula. Los caracteres no alfabéticos no son cambiados.  Por ejemplo, tolower("MiXeD cAsE 123") devuelve "mixed case 123".

toupper(string)

      Este devuelve una copia de string, con cada carácter en minúscula de la cadena reemplazado por su correspondiente carácter en mayúscula. Los caracteres no alfabéticos no son cambiados.  Por ejemplo, toupper("MiXeD cAsE 123") devuelve "MIXED CASE 123".

Funciones Implícitas (Built-in) para Entrada/Salida

close(filename)

      Cierra el fichero filename, para entrada o salida. El argumento podría ser de igual forma un comando de shell que fuese usado para redireccionar a o desde un pipe; entonces el pipe es cerrado.

      Ver la sección Cerrado de Ficheros de Entrada y Pipes para saber más sobre el cierre de ficheros y pipes de entrada. Ver la sección Cerrando los Ficheros de Salida y Pipes con respecto al cierre de ficheros y pipes de Salida.

system(comando_sistema)

      La función system permite al usuario ejecutar comandos del sistema operativo y después volver al programa awk. La función system ejecuta el comando dado por la cadena comando_sistema. Devuelve, como su valor, el status devuelto por el comando que fue ejecutado.

      Por ejemplo, si el siguiente fragmento de código es puesto en tu programa awk:

END {

     system("mail -s 'awk run done' operator < /dev/null")

}

le será enviado un correo al operador de sistema cuando el programa awk acabe el procesamiento de la entrada y comience su procesamiento de final de entrada.

      Dese cuenta de que dicho resultado podría ser también obtenido redireccionando print o printf a un pipe. Sin embargo, si tu programa awk es interactivo, system es útil para seguir programas grandes autocontenidos. Tales como un shell o un editor.

      Algunos sistemas operativos no pueden implementar la función system. System provoca un error fatal si no es soportada.

   
Índice
Manual