Successivo: , Precedente: , Su: Programmi vari   [Contenuti][Indice]


11.3.4 Stampare etichette per lettere

Ecco un programma “del mondo-reale”84. Questo script legge elenchi di nomi e indirizzi, e genera etichette per lettera. Ogni pagina di etichette contiene 20 etichette, su due file da 10 etichette l’una. Gli indirizzi non possono contenere più di cinque righe di dati. Ogni indirizzo è separato dal successivo da una riga bianca.

L’idea di base è di leggere dati per 20 etichette. Ogni riga di ogni etichetta è immagazzinata nel vettore riga. L’unica regola si occupa di riempire il vettore riga e di stampare la pagina dopo che sono state lette 20 etichette.

La regola BEGIN si limita a impostare RS alla stringa vuota, in modo che awk divida un record dal successivo quando incontra una riga bianca. (vedi la sezione Controllare come i dati sono suddivisi in record). Inoltre imposta LIMITE_LINEE a 100, perché 100 è il massimo numero di righe sulla pagina (20 * 5 = 100).

Il grosso del lavoro è svolto nella funzione stampa_pagina(). Le righe che compongono le etichette sono immagazzinate sequenzialmente nel vettore riga. Ma occorre stamparle in orizzontale: riga[1] a fianco di riga[6], riga[2] a fianco di riga[7], e così via. Questo si può fare utilizzando due cicli. Quello più esterno, controllato dalla variabile i, gestisce 10 righe di dati, ovvero la stampa di due etichette una a fianco dell’altra. Il ciclo più interno controllato dalla variabile j, gestisce le singole righe che compongono ognuno degli indirizzi. Poiché j varia da 0 a 4, ‘i+j’ è la riga j-esima dell’indirizzo di sinistra, e ‘i+j+5’ è quella stampata alla sua destra. L’output è simile a quello mostrato qui sotto:

riga 1          riga 6
riga 2          riga 7
riga 3          riga 8
riga 4          riga 9
riga 5          riga 10
…

La stringa di formato per printf%-41s’ allinea a sinistra i dati, e li stampa in un campo di lunghezza fissa.

Come nota finale, un’ulteriore riga bianca extra viene stampata alle righe 21 e 61, per mantenere entro i bordi l’output sulle etichette. Ciò dipende dalla particolare marca di etichette in uso quando il programma è stato scritto. Si noti anche che ci sono due righe bianche a inizio pagina e due righe bianche a fine pagina.

La regola END si occupa di stampare l’ultima pagina di etichette; è improbabile che il numero di indirizzi da stampare sia un multiplo esatto di 20:

# labels.awk --- stampare etichette per lettera

# Ogni etichetta è 5 righe di dati, qualcuna delle quali può essere bianca.
# I fogli con le etichetta hanno 2 righe bianche in cima alla pagina e altre 2
# a fine pagina.

BEGIN    { RS = "" ; LIMITE_LINEE = 100 }

function stampa_pagina(    i, j)
{
    if (NUMEROrighe <= 0)
        return

    printf "\n\n"        # in cima

    for (i = 1; i <= NUMEROrighe; i += 10) {
        if (i == 21 || i == 61)
            print ""
        for (j = 0; j < 5; j++) {
            if (i + j > LIMITE_LINEE)
                break
            printf "   %-41s %s\n", riga[i+j], riga[i+j+5]
        }
        print ""
    }

    printf "\n\n"        # in fondo

    delete riga
}

# regola principale
{
    if (contatore >= 20) {
        stampa_pagina()
        contatore = 0
        NUMEROrighe = 0
    }
    n = split($0, a, "\n")
    for (i = 1; i <= n; i++)
        riga[++NUMEROrighe] = a[i]
    for (; i <= 5; i++)
        riga[++NUMEROrighe] = ""
    contatore++
}

END {
    stampa_pagina()
}

Note a piè di pagina

(84)

“Del mondo-reale” è definito come “un programma effettivamente usato per realizzare qualcosa”.


Successivo: , Precedente: , Su: Programmi vari   [Contenuti][Indice]