8.10.- Funciones integradas

El lenguaje awk dispone de funciones integradas.

Hasta ahora hemos estado obteniendo nuestros ficheros de entrada desde el stream de entrada principal de awk – o la entrada estándar (normalmente tu terminal) o los ficheros especificados en la línea de comandos. El Lenguaje awk tiene un comando implícito especial llamado getline que puede ser usado para leer la entrada bajo tu control explícito.

El comando getline devuelve un 1 si encuentra un registro, y 0 si se encuentra el final del fichero. Si se produce algún error al obtener un registro, debido por ejemplo a que dicho fichero no pueda ser abierto, entonces getline devolverá un –1.

El comando getline puede ser usado sin argumentos para leer la entrada del fichero de entrada actual. Todo lo que hace en este caso es leer el siguiente registro de entrada y dividirlo en campos.

Según este listado (al que llamaremos superusuario.awk):

Obtenemos:

No pretendemos con este sencillo ejemplo que sea capaz de usar estas funciones. El manejo de estas redirecciones es complicado y en ocasiones se hace necesario forzar el cierre de una entrada o de un pipe. Para eso existe la función ‘close‘. Se usa haciendo ‘close (“fichero”)‘ o ‘close (“whoami”)‘.

La función getline nos permite leer la línea siguiente del flujo de datos sin subir al comienzo del tratamiento (no como sucede con next). También puede leer una línea desde un archivo, de la entrada estándar o de una tubería.

Su valor de retorno es 1 en caos de éxito, 0 si llega al final de un archivo, -1 en caso de error.

Lectura de la línea siguiente del flujo natural de awk.

El archivo trozo.txt donde un dato puede estar escrito en diversas líneas. El final de un dato se representa por el carácter “\n“. Si éste está precedido de una “\”, significa que la continuación del dato está contenida en la siguiente línea.

Tenemos el listado de trozos.txt.

Y el script que tratará dicho archivo.

El resultado de la ejecución de trozos.awk sería:

Desglosamos el script:

En este ejemplo veremos la lectura del teclado, y lectura de un archivo exterior al flujo común. A continuación mostramos el contenido del archivo agenda.txt:

El script entrada.awk se compone únicamente de una sección BEGIN. Éste programa abre el archivo agenda.txt para buscar el nombre de la persona introducido por el teclado. En este ejemplo, el archivo agenda.txt se abre en la sección BEGIN, y no se pasa como argumento en la línea de comandos. Veamos el listado:

#!/bin/awk

BEGIN {
	# leer el archivo agenda.txt
	while (1) {
		# Entrada del nombre
		printf "Buscar el nombre: "

		# Si se produce error o se recibe final de archivo (ctrl-d)
		# fin del tratamiento
		if ((getline nombre < "-" ) != 1) break

		# Si ningún nombre se introduce, 
		# vuelve a pedir una nueva solicitud de entrada de datos.
		if (length(nombre) == 0) continue

		# Bucle de lectura del archivo agenda.txt
		encontrado = "false"
		while ((getline < "agenda.txt") == 1) {
		# Búsqueda ignorando mayúsculas o minúsculas
		if (tolower($1) == tolower(nombre)) {
		encontrado = "true"
		print $0
		break		
		}
		}
		if (encontrado == "false") print nombre, " no está en la agenda."
	}
	print "\nAdios!"
}

El resultado sería:

Desglosamos:

 

 

…generando una nueva petición de entrada. Si no encuentra el nombre, mostrará un mensaje…

Veremos el resultado de un comando del sistema. La función getline recupera la salida estándar del comando date y la almacena en la variable $o veamos el listado del archivo comando.awk:

Ejecutamos el script y vemos el resultado.

 Este comando permite cerrar un archivo o una tubería de comunicación. Si esta llamada se omite, los recursos son liberados al finalizar el script.

Lo interesante de la orden de cierre en ciertos casos son:

  • Puede reposicionarse al comienzo de un archivo dentro del mismo proceso (cierre y después apertura).
  • Puede cerrar una tubería de comunicación para volver a utilizarla.
  • Libera los recursos como y cuando sea necesario (el sistema limita los procesos, en lo que concierne al número de archivos o/y  tuberías abiertas simultáneamente).

Veamos un cierre indispensable para poder releer el archivo (la apertura posiciona el indicador de posición al comienzo del archivo):

Ejecutando el script obtenemos:

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. Devuelve, como su valor, el status devuelto por el comando que fue ejecutado.

Podemos hacer lo mismo usando una variable awk inicializada anteriormente:

  • Con lo aprendido fabrica tus propios script.
  • Con los dos últimos ejemplos, intenta convertirlos en un archivo script ejecutable.