Successivo: Vettori di vettori, Precedente: Cancellazione, Su: Vettori [Contenuti][Indice]
| • Visitare vettori multidimensionali | Visitare vettori multidimensionali. |
Un vettore multidimensionale è un vettore in cui un elemento è
identificato da un insieme di indici invece che da un indice singolo. Per
esempio, un vettore bidimenisonale richiede due indici. Il modo consueto (in
molti linguaggi, compreso awk) per far riferimento a un elemento di
un vettore multidimensionale chiamato griglia è con
griglia[x,y].
I vettori multidimensionali sono resi disponibili in awk attraverso
la concatenazione di più indici in una stringa;
awk converte gli indici in stringhe
(vedi la sezione Conversione di stringhe e numeri) e
le concatena assieme, inserendo un separatore tra ognuna di loro. Ne
risulta una sola stringa che include i valori di ogni indice. La
stringa così composta viene usata come un singolo indice in un vettore
ordinario monodimensionale. Il separatore usato è il valore della variabile
predefinita SUBSEP.
Per esempio, supponiamo di valutare l’espressione ‘pippo[5,12] = "valore"’
quando il valore di SUBSEP è "@". I numeri 5 e 12 vengono
convertiti in stringhe che sono poi
concatenate con un ‘@’ tra di essi, dando "5@12"; di conseguenza,
l’elemento del vettore pippo["5@12"] è impostato a "valore".
Una volta che il valore dell’elemento è memorizzato, awk
ignora se sia stato memorizzato con un solo indice o con una
serie di indici. Le due espressioni ‘pippo[5,12]’ e
‘pippo[5 SUBSEP 12]’ sono sempre equivalenti.
Il valore di default di SUBSEP è la stringa "\034",
che contiene un carattere non stampabile che difficilmente appare in
un programma di awk e nella maggior parte dei dati di input.
Il vantaggio di scegliere un carattere improbabile discende dal fatto che i
valori degli indici che contengono una stringa corrispondente a SUBSEP
possono portare a stringhe risultanti ambigue. Supponendo che
SUBSEP valga "@", ‘pippo["a@b", "c"]’ e
‘pippo["a", "b@c"]’ risultano indistinguibili perché entrambi
sarebbero in realtà memorizzati come ‘pippo["a@b@c"]’.
Per verificare se una determinata sequenza di indici esiste in un vettore
multidimensionale, si usa lo stesso operatore (in) che viene usato
per i vettori monodimensionali. Si scrive l’intera sequenza di indici tra
parentesi, separati da virgole, come operando di sinistra:
if ((indice1, indice2, …) in vettore)
…
Qui vediamo un esempio, avendo in input un vettore bidimensionale di campi, ruota questo vettore di 90 gradi in senso orario e stampa il risultato. Si suppone che tutte le righe in input contengano lo stesso numero di elementi:
{
if (max_nf < NF)
max_nf = NF
max_nr = NR
for (x = 1; x <= NF; x++)
vettore[x, NR] = $x
}
END {
for (x = 1; x <= max_nf; x++) {
for (y = max_nr; y >= 1; --y)
printf("%s ", vettore[x, y])
printf("\n")
}
}
Dato l’input:
1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3
il programma produce il seguente output:
4 3 2 1 5 4 3 2 6 5 4 3 1 6 5 4 2 1 6 5 3 2 1 6
Successivo: Vettori di vettori, Precedente: Cancellazione, Su: Vettori [Contenuti][Indice]