Arrays Multi-Dimensionales - AWK

Un array multidimensional es un array en el cual un elemento es identificado por una secuencia de índices, no por un único índice. Por ejemplo, un array bidimensional requiere dos índices. La forma normal (en la mayoría de los lenguajes incluyendo awk) para referirse a un elemento de un array bidimensional llamado grid es mediante grid[x,y].

Los arrays multidimensionales son soportados en awk mediante la concatenación de índices en una cadena. Lo que ocurre es que awk convierte los índices en cadenas y los concatena juntos, con un separador entre ellos. Esto crea una única cadena que describe el valor de los índices separados. La cadena combinada es usada como un índice único (normal) en un array unidimensional normal. El separador usado es el valor de la variable implícita SUBSEP.

Por ejemplo, supón que evaluamos la expresión foo[5,12]=”valor” donde el valor de SUBSEP es “@”. Los números 5 y 12 están concatenados con una coma entre ellos, produciendo “5@12”; por lo que, el elemento del array foo[“5@12”] es fijado a “valor”.

Una vez que el valor del elemento es almacenado, awk no tiene forma de saber si se almacenó como un índice único o como una secuencia de índices. Las dos expresiones foo[5,12] y foo[5 SUBSEP 12] siempre tienen el mismo valor. El valor por defecto de SUBSEP es actualmente la cadena “\034”, que contiene un carácter no imprimible que es poco probable que aparezca en un programa awk o en los datos de entrada.

La falta de utilidad de elegir un carácter poco probable viene del hecho de que los valores de índices que contienen una cadena que concuerde con SUBSEP llevan a cadenas combinadas que son ambiguas. Supón que SUBSEP fuese “@”; entonces foo[“a@b”, “c”] y foo[“a”, “b@c”] serían indistinguibles porque ambas serían realmente almacenadas como foo[“a@b@c”]. Debido a que SUBSEP es “\034”, tales confusiones pueden ocurrir realmente solo cuando un índice contiene el carácter con código ASCII 034, lo cual es muy raro.

Puedes chequear si una secuencia de índice en particular existe en un array “multidimensional” con el mismo operador in utilizado para arrays de una sola dimensión. En lugar de un índice simple como el operando izquierdo, escribe la secuencia completa de índices separados por comas, en paréntesis:

(subscript1, subscript2, ...) in array

El siguiente ejemplo trata su entrada como un array bidimensional de campos; rota este array 90 grados en el sentido de las agujas del reloj e imprime el resultado. Asume que todas las líneas tienen el mismo número de elementos.

awk '{
if (max_nf < NF)
max_nf = NF max_nr = NR
for (x = 1; x <= NF; x++)
vector[x, NR] = $x
}
END {
for (x = 1; x <= max_nf; x++) { for (y = max_nr; y >= 1; --y)
printf("%s ", vector[x, y])
printf("\n")
}
}'

Cuando se le pasa la siguiente entrada:

  • 1 2 3 4 5 6
  • 2 3 4 5 6 1
  • 3 4 5 6 1 2
  • 4 5 6 1 2 3

produce la siguiente salida:

  • 4 3 2 1
  • 5 4 3 2
  • 6 5 4 3
  • 1 6 5 4
  • 2 1 6 5
  • 3 2 1 6

































Publicar un comentario

0 Comentarios