Precedente: , Su: Dimensione costante   [Contenuti][Indice]


4.6.4 Valore di campi con dati a larghezza fissa

Fin qui, tutto bene. Ma cosa succede se non ci sono abbastanza dati rispetto a quelli che dovrebbero essere presenti in base alla descrizione contenuta in FIELDWIDTHS? E invece cosa succede se i dati sono più di quelli previsti?

Per molti anni, quel che succede in questi casi non era definito con esattezza. A partire dalla versione 4.2 le regole sono le seguenti:

Dati sufficienti per uno o più campi

Per esempio, se FIELDWIDTHS è impostato a "2 3 4" e il record in input è ‘aabbb’. In questo caso, NF è impostato a due.

Dati insufficienti per la specifica di un campo

Per esempio, se FIELDWIDTHS è impostato a "2 3 4" e il record in input è ‘aab’. In questo caso, NF è impostato a due e il campo numero $2 ha come valore "b". L’idea è che, anche se ci sono meno caratteri di quelli previsti, qualcosa è presente, e quindi il dato dovrebbe essere reso disponibile al programma.

Troppi dati

Per esempio, se FIELDWIDTHS è impostato a "2 3 4" e il record in input è ‘aabbbccccddd’. In questo caso, NF è impostato a tre e i caratteri in eccesso (‘ddd’) sono ignorati. Se si vuole che gawk elabori i caratteri in più, si deve aggiungere un ‘*’ in fondo, nel valore di FIELDWIDTHS.

Troppi dati, ma è stato specificato ‘*

Per esempio, se FIELDWIDTHS è impostato a "2 3 4 *" e il record in input è ‘aabbbccccddd’. In questo caso, NF è impostato a quattro, e $4 ha come valore "ddd".

L’assegnazione di un valore a FS fa sì che gawk usi FS per separare nuovamente i campi. Si può usare ‘FS = FS’ per ottenere questo effetto, senza dover conoscere il valore corrente di FS. Per vedere quale tipo di separazione sia in atto, si può usare PROCINFO["FS"] (vedi la sezione Variabili predefinite con cui awk fornisce informazioni). Il suo valore è "FS" se si usa la normale separazione in campi, o "FIELDWIDTHS" se si usa la separazione in campi a larghezza fissa:

if (PROCINFO["FS"] == "FS")
    separazione in campi normale…
else if  (PROCINFO["FS"] == "FIELDWIDTHS")
    separazione in campi a larghezza fissa…
else
    separazione dei campi in base al contenuto(si veda
la sezione successiva)

Quest’informazione è utile quando si scrive una funzione che necessita di cambiare temporaneamente FS o FIELDWIDTHS, leggere alcuni record, e poi ripristinare le impostazioni originali (vedi la sezione Leggere la lista degli utenti, per un esempio di tale funzione).


Precedente: , Su: Dimensione costante   [Contenuti][Indice]