Funciones de UNIX

 

La sintaxis de las funciones UNIX es :

 

function nombre

{

orden ;

orden ;  Ordenes UNIX (Variables con $)

...

orden ;

}

 

Donde las ordenes se correspondes con comandos del SHELL. Una vez que se ha definido una función en un SHELL esta es accesible solo desde ese SHELL. Los parámetros de esa función se referencian desde dentro de la misma mediante las pseudo variables $1, $2...etc.

Los parámetros son iguales que en los guiones.

No existe la exportación de funciones.

Las funciones desaparecen cuando desaparece el SHELL.

 


 

E/S en awk :

 

Entrada :

 

Awk recorre automáticamente la entrada estándar analizando cada registro y comparándolo con los patrones.

En ocasiones es necesario leer de forma automáticamente alguna línea de la entrada estándar o de otro fichero. La función getline toma una línea de la entrada estándar y almacena su valor en una variable.

Esta lectura es aparte de la que realiza el awk .

Lee de la entrada estándar una línea y la almacena en una variable.

 

 

Salida :

 

Para generar salida awk dispone de las funciones print y printf las dos escriben en la salida estándar pero printf permite dar formato a la salida.

 

 

Tanto la entrada como la salida puede redireccionarse a un fichero distinto del estándar mediante >,>> y < con el fichero entre comillas.

El fichero de terminal se especifica como /dev/tty

 

Ejemplos :

 

  1. Dada una tabla como la siguiente :

 

 

ENERO

FEBRERO

...

DICIEMBRE

PERAS

10

20

...

7

UVAS

15

7

...

40

...

...

...

...

...

MANZANAS

15

20

...

30

 

Generar mediante awk un fichero de salida que muestre la misma tabla y calcule el total anual de cada fruta, el total de ventas por cada mes y el total general.

 

Solución :

 

Necesitamos tres patrones diferentes :

 

1º. Patrón para la cabecera: [^0-9] ó ^[ \ t] ó NR ==1

2º. Patrón para el resto: [^0-9] ó NR !=0 

3º. Patrón para la última línea: end

 

Los cuales tiene sus respectivas acciones :

 

1º { print $0 "\t TOTAL"; // sino se pone acción asume un print.

for (i=2 ; i < NF ; i++) // Para inicializar la matriz.

total [ i ] = 0 ;

}

 

2º { suma = 0 ;

for (i=2 ; i < NF ; i++)

{

suma = suma + $i

total[ i ] = total[ i ] + $i

}

print $0 "\ t" suma ;

}

 

3º { suma = 0 ;

for (i in total)

{

linea = linea "\ t" total [ i ] ;

suma = suma + total [ i ] ;

}

print linea "\ t" suma ;

}

 

NOTA : Es bueno poner " ; " después de todas las acciones.

 

 

  1. Realizar mediante awk un corrector ortográfico que elimine palabras duplicadas y consecutivas. Para cada palabra duplicada solicitará confirmación interactivamente.

 

<patrón_vacío>

// acción

{

if (ant == $1)

{

print "Palabra "$1 " duplicada, ¿Eliminar ?" > /dev/tty

getline resp < /dev/tty ;

if resp = " N " printf ("%s \ n", ant) 

else printf("\ n")

}

for (i=1 ; i <NF ; i++)

if ($i == $(i+1))

{

print "Palabra "$1 " duplicada, ¿Eliminar ?" > /dev/tty

getline resp < /dev/tty ;

if resp = " N " printf ("%s", $i) ;

else printf("%s, $i) ;

}

ant = $NF ;

}

BEGIN {

ant = " "

}

END {

printf ("%s, $i) 

}