В процедурной части шаблона begin в переменную FS записывается символ '#" -pазделитель полей во входном файле. Затем создаются два массива, belt и student, индексами которых являются соответственно названия поясов и названия категорий учеников. Оба массива остаются неинициализированными, их тип не определен.
В первом цикле for значение первого поля каждой записи входного файла сравнивается с названием индекса массива belt (индекс равен "Yellow", "Orange" или "Red"). Если обнаруживается совпадение, выполняется приращение элемента, хранящегося в массиве по этому индексу. Поскольку операция ++ (инкремент) определена для целочисленных значений, утилита awk считает, что массив целочисленный, и инициализирует его элементы значением 0.
Во втором цикле for значение второго поля сравнивается с названием индекса массива student (индекс равен "Junior" или "Senior"). Результат операции вычисляется так же, как и в первом цикле.
В процедурной части шаблона end осуществляется вывод итоговых результатов.
$ belts.awk grade_student.txt
The club has 2 Red belts
The club has 2 Orange belts
The club has 3 Yellow belts
The club has 7 Senior students
The club has 8 Junior students
9.3. Заключение
Язык программирования awk может показаться сложным для изучения, но если осваивать его на примерах употребления отдельных команд и небольших сценариев, то процесс обучения не будет слишком трудным. В данной главе мы изучили основы awk, не углубляясь в детали, но, тем не менее, получили необходимый минимум сведений, относящихся к этому языку. Утилита awk является важным инструментом shell–программирования, и чтобы применять ее, вам не обязательно быть экспертом по языку awk.
Работа с редактором sed
Редактор sed относится к текстовым редакторам потокового типа и не является интерактивной программой. Он предназначен для обработки текстовых данных, поступающих из файла или стандартного входного потока. Отличительной особенностью редактора sed является то, что он позволяет модифицировать файлы в фоновом режиме. Задача пользователя сводится к тому, чтобы задать последовательность команд редактирования, а всю остальную работу выполнит сам редактор. Кроме того, sed допускает внесение всех изменений за один проход, а это превращает его в достаточно эффективный и, что важнее всего, быстродействующий инструмент редактирования текста.
В этой главе рассматриваются следующие темы:
• синтаксис команд sed;
• поиск строк по номерам и с использованием регулярных выражений;
• изменение входного текста и добавление текста в выходной поток;
• примеры команд и сценариев sed.
Команды sed вводятся в командной строке либо размещаются в файле сценария подобно тому, как это делается в случае с утилитой awk. При использовании sed важно помнить следующее: этот редактор оставляет без изменения исходный файл независимо от того, какая команда выполняется. Копия входного потока помещается в буфер редактирования, а все изменения направляются на экран или переадресуются в выходной файл.
Поскольку редактор sed не предназначен для работы в интерактивном режиме, текстовые строки, подлежащие изменению, отбираются либо по номерам, либо на основании соответствия регулярному выражению.
10.1. Чтение и обработка данных в sed
Общая схема работы редактора sed такова:
1. Редактор последовательно извлекает строки текста из файла или стандартного входного потока и копирует их в буфер редактирования.
2. Затем он считывает первую команду из командной строки или сценария, осуществляет поиск строки с указанным номером или строки, соответствующей шаблону, и применяет к ней эту команду.
3. Второй пункт повторяется до тех пор, пока не будет исчерпан список команд.
10.2. Вызов редактора sed
Вызвать редактор sed можно тремя способами:
1. Ввести набор команд sed в командной строке.
2. Поместить набор команд sed в файл и передать его редактору sed в командной строке.
3. Поместить набор команд sed в файл сценария и сделать его выполняемым. Если редактор sed вызывается для выполнения одиночных команд, формат
командной строки будет таким:
sed [опции] 'команды' входной_файл
Как и в awk, не забудьте заключить команды в одинарные кавычки, чтобы защитить от интерпретации находящиеся в них специальные символы.
Если команды sed помещены в отдельный файл, командная строка примет следующий вид:
sed [опции] — f файл_сценария входной_файл
Если файл сценария является исполняемым, запустить его на выполнение следует таким образом:
файл_сценария [опции] входной_файл
Когда входной файл не указан, sed будет ожидать поступления данных из стандартного входного потока: с клавиатуры или из канала.
Ниже перечислены основные опции редактора sed и описано их назначение: