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 :
|
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.
<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)
}