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


4.6.1 Elaborare dati di lunghezza fissa

Un esempio di dati a lunghezza fissa può essere l’input per vecchi programmi Fortran dove dei numeri sono elencati uno dopo l’altro, o l’output di programmi che non prevedono che questo loro output sia dato in input ad altri programmi.

Un esempio di quest’ultimo caso è una tabella dove tutte le colonne sono allineate usando un numero variabile di spazi e dove i campi vuoti sono solo spazi. Chiaramente, la normale divisione in campi di awk basata su FS non funziona bene in questa situazione. Sebbene un programma awk portabile possa usare una serie di chiamate substr() su $0 (vedi la sezione Funzioni di manipolazione di stringhe), questo è scomodo e inefficiente se il numero dei campi è elevato.

La suddivisione di un record in input in campi a larghezza fissa viene specificata assegnando una stringa contenente numeri separati da spazi alla variabile predefinita FIELDWIDTHS. Ogni numero specifica la larghezza del campo, comprese le colonne tra i campi. Se si vogliono ignorare le colonne tra i campi si può specificare la loro larghezza come un campo separato che verrà poi ignorato. È un errore fatale definire una larghezza di campo che abbia un valore negativo.

I dati seguenti costituiscono un output del programma di utilità Unix w. È utile per spiegare l’uso di FIELDWIDTHS:

 10:06pm  up 21 days, 14:04,  23 users
User     tty       login  idle   JCPU   PCPU  what
hzuo     ttyV0     8:58pm            9      5  vi p24.tex
hzang    ttyV3     6:37pm    50                -csh
eklye    ttyV5     9:53pm            7      1  em thes.tex
dportein ttyV6     8:17pm  1:47                -csh
gierd    ttyD3    10:00pm     1                elm
dave     ttyD4     9:47pm            4      4  w
brent    ttyp0    26Jun91  4:46  26:46   4:41  bash
dave     ttyq4    26Jun9115days     46     46  wnewmail

Il seguente programma prende l’input sopra mostrato, converte il tempo di inattività in numero di secondi, e stampa i primi due campi e il tempo di inattività calcolato:

BEGIN  { FIELDWIDTHS = "9 6 10 6 7 7 35" }
NR > 2 {
    inat = $4
    sub(/^ +/, "", inat)   # togli spazi prima del valore
    if (inat == "")
        inat = 0
    if (inat ~ /:/) {      # hh:mm
        split(inat, t, ":")
        inat = t[1] * 60 + t[2]
    }
    if (inat ~ /days/)
        inat *= 24 * 60 * 60

    print $1, $2, inat
}

NOTA: Questo programma usa diverse funzionalità di awk non ancora trattate.

L’esecuzione del programma sui dati produce il seguente risultato:

hzuo      ttyV0  0
hzang     ttyV3  50
eklye     ttyV5  0
dportein  ttyV6  107
gierd     ttyD3  1
dave      ttyD4  0
brent     ttyp0  286
dave      ttyq4  1296000

Un altro esempio (forse più pratico) di dati di input con larghezza costante è l’input da un mazzo di schede elettorali. In alcune parti degli Stati Uniti, i votanti marcano le loro scelte perforando delle schede elettroniche.

Queste schede vengono poi elaborate per contare i voti espressi per ogni singolo candidato o su ogni determinato quesito. Siccome un votante può scegliere di non votare su alcune questioni, qualsiasi colonna della scheda può essere vuota. Un programma awk per elaborare tali dati potrebbe usare la funzionalità FIELDWIDTHS per semplificare la lettura dei dati. (Naturalmente, riuscire a eseguire gawk su un sistema con lettori di schede è un’altra storia!)


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