Successivo: , Precedente: , Su: Gestione File Dati   [Contenuti][Indice]


10.3.2 Rileggere il file corrente

Un’altra richiesta per una nuova funzione predefinita è stata per una funzione per rileggere il file corrente. L’utente che l’ha richiesta non voleva dover usare getline (vedi la sezione Richiedere input usando getline) all’interno di un ciclo.

Comunque, se non si è nella regola END, è piuttosto facile fare in modo di chiudere il corrente file in input immediatamente e ricominciare a leggerlo dall’inizio. In mancanza di un nome migliore, chiameremo la funzione rewind():

# rewind.awk --- ricarica il file corrente e ricomincia a leggerlo

function rewind(    i)
{
    # sposta in alto i rimanenti argomenti
    for (i = ARGC; i > ARGIND; i--)
        ARGV[i] = ARGV[i-1]

    # assicurarsi che gawk sappia raggiungerli
    ARGC++

    # fa sì che il file corrente sia il prossimo a essere letto
    ARGV[ARGIND+1] = FILENAME

    # do it
    nextfile
}

La funzione rewind() dipende dalla variabile ARGIND (vedi la sezione Variabili predefinite con cui awk fornisce informazioni), che è specifica di gawk. Dipende anche dalla parola chiave nextfile (vedi la sezione L’istruzione nextfile). Perciò, non si dovrebbe chiamarla da una regola ENDFILE. (Non sarebbe peraltro necessario, perché gawk legge il file successivo non appena la regola ENDFILE finisce!)

Occorre prestare attenzione quando si chiama rewind(). Si può provocare una ricorsione infinita se non si sta attenti. Ecco un esempio di uso:

$ cat dati
-| a
-| b
-| c
-| d
-| e

$ cat test.awk
-| FNR == 3 && ! riavvolto {
-|    riavvolto = 1
-|    rewind()
-| }
-|
-| { print FILENAME, FNR, $0 }

$ gawk -f rewind.awk -f test.awk dati 
-| data 1 a
-| data 2 b
-| data 1 a
-| data 2 b
-| data 3 c
-| data 4 d
-| data 5 e

Successivo: , Precedente: , Su: Gestione File Dati   [Contenuti][Indice]