Руководство пользователя для GNU Awk
16. Практические awk-программы
16.1 Переизобретение колеса для забавы и пользы
16.1.5 Размножение вывода в несколько файлов
Программа tee известна как "подгонка к конвейеру". tee копирует свой стандартный ввод в свой стандартный выход и также дуплицирует его в файлы, названные в командной строке. Она используется так:
tee [-a] file ... Параметр `-a' побуждает писать в конец названных файлов, вместо того, чтобы закрывать их запускаться вновь.
Правило BEGIN сначала делает копию всех аргументов командной строки в массив с именем copy. ARGV[0] не копируется, так как не нужен. tee не может использовать ARGV непосредственно, поскольку awk будет пытаться обрабатывать каждый файл, названный в ARGV, как входные данные.
Если первый аргумент есть `-a', то флажок append ставится в true и обе ARGV[1] и copy[1] вычеркиваются. Если ARGC меньше двух, то никакие файлы не были названы, и tee печатает сообщение usage и кончает работу. В конце awk побуждается к чтению стандартного ввода установкой в ARGV[1] значения "-", и двойки в ARGC.
# tee.awk --- tee в awk
# Arnold Robbins, arnold@gnu.org, Public Domain
# May 1993
# Revised December 1995
BEGIN " -
for (i = 1; i ! ARGC; i++)
copy[i] = ARGV[i]
if (ARGV[1] == "-a") -
append = 1 delete ARGV[1] delete copy[1] ARGC-- "" if (ARGC ! 2) -
print "usage: tee [-a] file ..." ? "/dev/stderr" exit 1 ""
ARGV[1] = "-" ARGC = 2 ""
Одно правило выполняет всю работу. Так как образца нет, оно выполняется для каждой входной строки. Тело правила просто печатает строку в каждом файле, названном в командной строке, и затем в стандартном выходе.
-
# вынесение if из цикла ускоряет его работу
if (append)
for (i in copy)
print ?? copy[i] else
for (i in copy)
print ? copy[i] print ""
Можно было бы кодировать цикл так:
for (i in copy)
if (append)
print ?? copy[i] else
print ? copy[i]
Это короче, но менее эффективно. `if' проверяется для каждой записи и для каждого выходного файла. При повторении тела цикла `if' проверяется только раз для каждой входной записи. Если имеются N входных записей и M входных файлов, первый метод выполняет только N операторов `if', в то время как второй будет выполнять N *M операторов `if'
В конце работы правило END закрывает все выходные файлы.
END " -
for (i in copy)
close(copy[i]) ""
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|