Successivo: Getline variabile, Su: Getline [Contenuti][Indice]
getline senza argomentiIl comando getline può essere usato senza argomenti per leggere l’input
dal file in input corrente. Tutto quel che fa in questo caso è leggere il
record in input successivo e dividerlo in campi. Questo è utile se è
finita l’elaborarezione del record corrente, e si vogliono fare delle
elaborazioni particolari sul record successivo proprio adesso.
Per esempio:
# rimuovere il testo tra /* e */, compresi
{
while ((inizio = index($0, "/*")) != 0) {
prima = substr($0, 1, inizio - 1) # parte iniziale della stringa
dopo = substr($0, inizio + 2) # ... */ ...
while ((fine = index(dopo, "*/")) == 0) { # */ è nella parte finale?
# passa ai record seguenti
if (getline <= 0) {
print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
exit
}
# costruisce la riga usando la concatenazione di stringhe
dopo = dopo $0
}
dopo = substr(dopo, fine + 2) # rimuove il commento
# costruisce la riga di output usando la concatenazione
# di stringhe
$0 = prima dopo
}
print $0
}
Questo programma awk cancella i commenti in stile C
(‘/* … */’) dall’input.
Usa diverse funzionalità che non sono ancora state trattate, incluse la
concatenazione di stringhe
(vedi la sezione Concatenazione di stringhe)
e le funzioni predefinite index() e substr()
(vedi la sezione Funzioni di manipolazione di stringhe).
Sostituendo ‘print $0’ con altre
istruzioni, si possono effettuare elaborazioni più complesse sull’input
decommentato, come ricercare corrispondenze di un’espressione regolare.
Ecco un esempio di file in input:
mon/*comment*/key rab/*commen t*/bit horse /*comment*/more text part 1 /*comment*/part 2 /*comment*/part 3 no comment
Quando lo si esegue, l’output è:
$ awk -f strip_comments.awk example_text -| monkey -| rabbit -| horse more text -| part 1 part 2 part 3 -| no comment
Questa forma del comando getline imposta NF,
NR, FNR, RT e il valore di $0.
NOTA: Il nuovo valore di
$0è usato per verificare le espressioni di ricerca di ogni regola successiva. Il valore originale di$0che ha attivato la regola che ha eseguito lagetlineviene perso. A differenza digetline, l’istruzionenextlegge un nuovo record ma inizia a elaborarlo normalmente, a partire dalla prima regola presente nel programma. Vedi la sezione L’istruzionenext.
Successivo: Getline variabile, Su: Getline [Contenuti][Indice]