El lenguaje de programación Awk admite matrices. Como parte de nuestra serie de ejemplos de awk en curso, hemos visto variables definidas por el usuario de awk y variables integradas de awk. Los arreglos son una extensión de las variables. Las matrices son variables que contienen más de un valor. Al igual que las variables, las matrices también tienen nombres. En algunos lenguajes de programación, las matrices deben declararse para que la memoria se asigne a las matrices. Además, los índices de matriz suelen ser enteros, como matriz[1], matriz[2], etc.,
Arreglo Asociativo Awk
Awk solo admite matriz asociativa. Las matrices asociativas son como las matrices tradicionales, excepto que utilizan cadenas como índices en lugar de números. Al usar una matriz asociativa, puede imitar una matriz tradicional utilizando una cadena numérica como índice.
Syntax: arrayname[string]=value
En la sintaxis de awk anterior:
- nombre de matriz es el nombre de la matriz.
- cadena es el índice de una matriz.
- valor es cualquier valor asignado al elemento de la matriz.
Acceso a elementos de la matriz AWK
Si desea acceder a un elemento en particular en una matriz, puede acceder a través de su índice:nombre de matriz [índice], que le brinda el valor asignado en ese índice.
Si desea acceder a todos los elementos de la matriz, puede usar un bucle para recorrer todos los índices de una matriz, como se muestra a continuación.
Syntax: for (var in arrayname) actions
En la sintaxis de awk anterior:
- var es cualquier nombre de variable
- en es una palabra clave
- nombre de matriz es el nombre de la matriz.
- acciones son una lista de sentencias a realizar. Si desea realizar más de una acción, debe encerrarse entre llaves.
Este bucle ejecuta una lista de acciones para cada valor diferente que se usó como índice en una matriz con la variable var establecida en ese índice.
Eliminar un elemento de la matriz AWK
Si desea eliminar un elemento en un índice particular de una matriz, use la instrucción awk delete. Una vez que eliminó un elemento de una matriz awk, ya no podrá obtener ese valor.
Syntax: delete arrayname[index];
El siguiente comando de bucle elimina todos los elementos de una matriz. No existe una declaración única para eliminar todos los elementos de una matriz. Tienes que pasar por el ciclo y eliminar cada elemento de la matriz usando la instrucción awk delete.
for (var in array) delete array[var]
5 ejemplos prácticos de matrices Awk
Todos los ejemplos que se dan a continuación utilizan el archivo Iplogs.txt que se muestra a continuación. Este archivo de texto de muestra contiene una lista de direcciones IP solicitadas por el servidor de puerta de enlace. Este archivo de muestra Iplogs.txt contiene datos en el siguiente formato:
[date] [time] [ip-address] [number-of-websites-accessed]
$ cat Iplogs.txt 180607 093423 123.12.23.122 133 180607 121234 125.25.45.221 153 190607 084849 202.178.23.4 44 190607 084859 164.78.22.64 12 200607 012312 202.188.3.2 13 210607 084849 202.178.23.4 34 210607 121435 202.178.23.4 32 210607 132423 202.188.3.2 167
Ejemplo 1. Enumere todas las direcciones IP únicas y la cantidad de veces que se solicitó
$ awk '{ > Ip[$3]++; > } > END{ > for (var in Ip) > print var, "access", Ip[var]," times" > } > ' Iplogs.txt 125.25.45.221 access 1 times 123.12.23.122 access 1 times 164.78.22.64 access 1 times 202.188.3.2 access 2 times 202.178.23.4 access 3 times
En el guión anterior:
- El tercer campo ($3) es una dirección IP. Esto se usa como un índice de una matriz llamada Ip.
- Para cada línea, incrementa el valor del índice de dirección IP correspondiente.
- Finalmente, en la sección FIN, todo el índice será la lista de direcciones IP únicas y sus valores correspondientes serán el recuento de ocurrencias.
Ejemplo 2. Enumere todas las direcciones IP y calcule a cuántos sitios accedió
El último campo en Iplogs.txt es la cantidad de sitios a los que accedió cada dirección IP en una fecha y hora en particular. El siguiente script genera el informe que tiene una lista de direcciones IP y cuántas veces solicitó la puerta de enlace y el número total de sitios a los que accedió.
$cat ex2.awk BEGIN { print "IP Address\tAccess Count\tNumber of sites"; } { Ip[$3]++; count[$3]+=$NF; } END{ for (var in Ip) print var,"\t",Ip[var],"\t\t",count[var]; } $ awk -f ex2.awk Iplogs.txt IP Address Access Count Number of sites 125.25.45.221 1 153 123.12.23.122 1 133 164.78.22.64 1 12 202.188.3.2 2 180 202.178.23.4 3 110
En el ejemplo anterior:
- Tiene dos matrices. El índice para ambas matrices es el mismo, que es la dirección IP (tercer campo).
- La primera matriz llamada "Ip" tiene una lista de direcciones IP únicas y su recuento de ocurrencias. La segunda matriz llamada "recuento" tiene la dirección IP como índice y su valor será el último campo (número de sitios), por lo que cada vez que llega la dirección IP, sigue agregando el último campo.
- En la sección FIN, revisa todas las direcciones IP e imprime la dirección IP y el recuento de accesos de la matriz llamada IP y la cantidad de sitios de la matriz.
Ejemplo 3. Identificar el día de máximo acceso
$ cat ex3.awk { date[$1]++; } END{ for (count in date) { if ( max < date[count] ) { max = date[count]; maxdate = count; } } print "Maximum access is on", maxdate; } $ awk -f ex3.awk Iplogs.txt Maximum access is on 210607
En este ejemplo:
- la matriz llamada "fecha" tiene la fecha como índice y el recuento de ocurrencias como el valor de la matriz.
- max es una variable que tiene el valor de conteo y se usa para averiguar la fecha que tiene el conteo máximo.
- maxdate es una variable que tiene la fecha para la cual el conteo es máximo.
Ejemplo 4. Invierta el orden de las líneas en un archivo
$ awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' Iplogs.txt 210607 132423 202.188.3.2 167 210607 121435 202.178.23.4 32 210607 084849 202.178.23.4 34 200607 012312 202.188.3.2 13 190607 084859 164.78.22.64 12 190607 084849 202.178.23.4 44 180607 121234 125.25.45.221 153 180607 093423 123.12.23.122 133
En este ejemplo,
- Comienza registrando todas las líneas en la matriz 'a'.
- Cuando el programa ha terminado de procesar todas las líneas, Awk ejecuta el bloque END { }.
- El bloque END recorre los elementos de la matriz 'a' e imprime las líneas grabadas de manera inversa.
Ejemplo 5. Elimina líneas duplicadas y no consecutivas usando awk
$ cat > temp foo bar foo baz bar $ awk '!($0 in array) { array[$0]; print }' temp foo bar baz
En este ejemplo:
- Awk lee cada línea del archivo "temp", y usando el operador "in" verifica si la línea actual existe en la matriz "a".
- Si no existe, almacena e imprime la línea actual.
Lecturas recomendadas