Successivo: , Su: Getline   [Contenuti][Indice]


4.10.1 Usare getline senza argomenti

Il 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 $0 che ha attivato la regola che ha eseguito la getline viene perso. A differenza di getline, l’istruzione next legge un nuovo record ma inizia a elaborarlo normalmente, a partire dalla prima regola presente nel programma. Vedi la sezione L’istruzione next.


Successivo: , Su: Getline   [Contenuti][Indice]