Successivo: Programma utilizzo parole, Precedente: Programma translate, Su: Programmi vari [Contenuti][Indice]
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() }
“Del mondo-reale” è definito come “un programma effettivamente usato per realizzare qualcosa”.
Successivo: Programma utilizzo parole, Precedente: Programma translate, Su: Programmi vari [Contenuti][Indice]