Successivo: Controllo di file, Precedente: Funzione filetrans, Su: Gestione File Dati [Contenuti][Indice]
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: Controllo di file, Precedente: Funzione filetrans, Su: Gestione File Dati [Contenuti][Indice]