Successivo: Programma uniq, Precedente: Programma split, Su: Cloni [Contenuti][Indice]
Il programma tee è noto come pipe fitting (tubo secondario).
tee copia il suo standard input al suo standard output e inoltre lo
duplica scrivendo sui file indicati nella riga di comando. La sua sintassi
è la seguente:
tee [-a] file …
L’opzione -a chiede a tee di aggiungere in fondo al file
indicato, invece che riscriverlo dall’inizio.
La regola BEGIN dapprima fa una copia di tutti gli argomenti presenti
sulla riga di comando, in un vettore di nome copia.
ARGV[0] non serve, e quindi non viene copiato.
tee non può usare ARGV direttamente, perché awk tenta
di elaborare ogni nome-file in ARGV come dati in input.
Se il primo argomento è -a, la variabile flag
append viene impostata a vero, e sia ARGV[1] che
copia[1] vengono cancellati. Se ARGC è minore di due, nessun
nome-file è stato fornito, e tee stampa un messaggio di sintassi ed
esce.
Infine, awk viene obbligato a leggere lo standard input
impostando ARGV[1] al valore "-" e ARGC a due:
# tee.awk --- tee in awk
#
# Copia lo standard input a tutti i file di output indicati.
# Aggiunge in fondo se viene data l'opzione -a.
#
BEGIN {
for (i = 1; i < ARGC; i++)
copia[i] = ARGV[i]
if (ARGV[1] == "-a") {
append = 1
delete ARGV[1]
delete copia[1]
ARGC--
}
if (ARGC < 2) {
print "sintassi: tee [-a] file ..." > "/dev/stderr"
exit 1
}
ARGV[1] = "-"
ARGC = 2
}
La seguente regola è sufficiente da sola a eseguire il lavoro. Poiché non è presente alcun criterio di ricerca, la regola è eseguita per ogni riga di input. Il corpo della regola si limita a stampare la riga su ogni file indicato nella riga di comando, e poi sullo standard output:
{
# spostare l'if fuori dal ciclo ne velocizza l'esecuzione
if (append)
for (i in copia)
print >> copia[i]
else
for (i in copia)
print > copia[i]
print
}
È anche possibile scrivere il ciclo così:
for (i in copia)
if (append)
print >> copia[i]
else
print > copia[i]
Questa forma è più concisa, ma anche meno efficiente. L’‘if’ è
eseguito per ogni record e per ogni file di output. Duplicando il corpo
del ciclo, l’‘if’ è eseguito solo una volta per ogni record in input.
Se ci sono
N record in input e M file di output, il primo metodo esegue solo
N istruzioni ‘if’, mentre il secondo esegue
N*M istruzioni ‘if’.
Infine, la regola END fa pulizia, chiudendo tutti i file di output:
END {
for (i in copia)
close(copia[i])
}
Successivo: Programma uniq, Precedente: Programma split, Su: Cloni [Contenuti][Indice]