Руководство пользователя для GNU Awk
16. Практические awk-программы
16.1 Переизобретение колеса для забавы и пользы
16.1.4 Разделение большого файла на части
Программа split разделяет большие текстовые файлы на меньшие части. По умолчанию, выходные файлы именуются `xaa', `xab', и т. д. Каждый файл содержит 1000 строк, за исключением последнего. Для изменения количества строк в каждом файле нужно указывать в командной строке число с предшествующим минусом, например `-500' для файлов с 500 строк вместо 1000. Чтобы изменить имена выходных файлов на что-нибудь вроде `myfileaa', `myfileab', и т.д., нужно указать дополнительный аргумент с именем файла.
Приведем версию split в awk. Она использует функции ord и chr, представленные в разделе 15.5 [Перевод символов в числа и обратно], стр. 174. Программа сначала устанавливает параметры по умолчанию, а затем проверяет, не слишком ли много аргументов задано. Затем она смотрит на каждый заданный аргумент. Первый аргумент может быть минусом со следующим за ним числом. Если так, то он выглядит как отрицательное число. Это число превращается в положительное и становится счетчиком строк. Имя файла с данными обходится и последний аргумент используется как префикс для имен выходных файлов.
# split.awk --- моделирует split в awk
# Arnold Robbins, arnold@gnu.org, Public Domain
# May 1993
# использование: split [-num] [file] [outname]
BEGIN -
outfile = "x"
# default count = 1000 if (ARGC ? 4)
usage()
i = 1 if (ARGV[i] ~ /^-[0-9]+$/) -
ount = -ARGV[i] ARGV[i] = "" i++ ""
# проверка argv в случае чтения из stdin вместо файла
if (i in ARGV)
i++ # пропуск имени файла с данными
if (i in ARGV) -
outfile = ARGV[i] ARGV[i] = "" ""
s1 = s2 = "a" out = (outfile s1 s2) ""
Следующее правило делает большую часть работы. tcount (временный счетчик) следит, сколько строк было напечатано до сих пор в выходном файле. Если это больше чем count, нужно закрыть текущий файл и начать новый. s1 and s2 следят за текущими суффиксами имени файла. Если они обе `z', файл слишком велик. В противном случае s1 передвигается на следующую букву алфавита, а s2 начинается опять с `a'.
if (++tcount ? count) -
close(out) if (s2 == "z") -
if (s1 == "z") -
printf("split: %s is too large to split"n", "
FILENAME) ? "/dev/stderr" exit 1 "" s1 = chr(ord(s1) + 1) s2 = "a" "" else
s2 = chr(ord(s2) + 1) out = (outfile s1 s2) tcount = 1 "" print ? out ""
The usage function simply prints an error message and exits.
function usage( e) -
e = "usage: split [-num] [file] [outname]" print e ? "/dev/stderr" exit 1 ""
Используется переменная e, так что результат хорошо размещается на странице. Эта программа несколько небрежна; она надеется, что awk автоматически закроет последний файл, вместо того, чтобы сделать это самой в правиле END.
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|