Recorrido de todos los elementos de un Array - AWK

En programas que utilizan arrays, a menudo necesitas un bucle que se ejecute para cada elemento de un array. En otros lenguajes, donde los arrays son contíguos y los índices están limitados a enteros positivos, esto es fácil: el índice mayor es una unidad menor que el tamaño del array, y puedes encontrar todos los índices válidos recorriendo desde 0 hasta dicho valor. Esta técnica no servirá en awk, ya que cualquier número o cadena podría ser un índice de array. Así que awk tiene un tipo especial de sentencia for para el recorrido de arrays:

for (variable in array) cuerpo

Esto hace que se ejecute cuerpo una vez para cada valor diferente que su programa haya usado previamente como un índice en array, con la variable variable que recibe el valor de dicho índice.

Aquí tienes un programa que utiliza esta forma de la sentencia for. La primera regla escanea los registros de entrada y anota que palabras aparecen (al menos una vez) en la entrada, almacenando un 1 en el array, usando la palabra en cuestión como índice. La segunda regla escanea los elementos del array used para encontrar todas las palabras distintas que aparecen en la entrada. Imprime todas las palabras que son de más de 10 caracteres y también imprime el número de veces que aparecen dichas palabras en el fichero de entrada.

# Record a 1 for each word that is used at least once.
{
for (i = 1; i <= NF; i++) used[$i] = 1
}
# Find number of distinct words more than 10 characters long. END {
num_long_words = 0 for (x in used)
if (length(x) > 10) {
++num_long_words print x
}
print num_long_words, "words longer than 10 characters"
}

El orden en el cual esta sentencia accede a los elementos del array es determinado por la disposición interna de los elementos del array dentro de awk y no puede ser controlada ni cambiada. Esto puede llevar a problemas si se añaden nuevos elementos al array mediante sentencias en cuerpo, no se puede predecir si el bucle for recorrerá o no estos nuevos elementos. De forma similar, cambiando variable dentro del bucle podría producir resultados extraños.




















Publicar un comentario

0 Comentarios