Precedente: Consentire dati a fine record, Su: Dimensione costante [Contenuti][Indice]
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:
Per esempio, se FIELDWIDTHS è impostato a "2 3 4" e il record
in input è ‘aabbb’. In questo caso, NF è impostato a due.
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.
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.
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: Consentire dati a fine record, Su: Dimensione costante [Contenuti][Indice]