
- •Программирование вывода текста awk
- •Внимание. В awk могут быть проблемы с русской буквой я/Я.
- •Полная командная строка для awk
- •Оператор-шаблон используется для выбора строк из файла,
- •Внимание! Нельзя одновременно опускать и шаблон и действие.
- •Если оператор-шаблон и/или оператор действия задаются в командной строке, то они заключаются в
- •Записи делятся на поля, разделенные
- •В awk не существует оператора read. awk автоматически получает каждую запись.
- •1. Обращение к полям
- •Например, пусть у нас имеется файл с именем cars.file, содержащий:
- •Причем при выводе на экран между наименованием марки и наименованием фирмы будет стоять
- •c) Оператор print “” печатает пустую строку, о оператор print печатает текущую строку
- •Этот символ можно переопределить, используя в качестве разделителя любой одиночный символ.
- •Второй способ переопределения
- •Однако, если в качестве разделителя
- •2. Выполнение команд из входного файла
- •Тогда предыдущий пример можно выполнить так:
- •Итак, выполнение команд из файла необходимо делать в следующей последовательности:
- •Если в одной строке несколько операторов-
- •В операторе print фрагменты, отделяемые запятой, печатаются через символы разделения полей выходного потока,
- •Для полного контроля над выходным потоком используется оператор printf,
- •Если нет выходного потока, то считается, что данные удовлетворяют соответствующему критерию.
- •Причем необходимо помнить, что это разные шаблоны.
- •В шаблонах можно применять метасимволы, как и в функции grep:
- •A. Шаблоны BEGIN и END
- •Некоторые версии awk требуют, чтобы шаблон BEGIN был первым шаблоном программы, а шаблон
- •задает строки от 10-ой до 20-ой
- •Например, в файле file.me находятся строки:
- •Если выражение арифметическое, то
- •C. Использование арифметических
- •-переменную SUM, введенную пользователем;
- •В этих всех примерах использование опции -f эквивалентно набору операторов в командной строке
- •Встроенные переменные awk
- •OFMT - формат вывода чисел ( по умолчанию принят %6g (См. printf ),
- •Операции, выполняемые awk
- •Операции отношения
- •В awk любое выражение можно использовать с любой операцией. Преобразование числа в строку
- •Встроенные функции awk
- •rand()
- •split (S,A,C) - разбиение строки S на массив
- •tolower (Str)- переводит символы строки Str в нижний регистр;
- •sub (Re, SubStr, Str) – замещает в строке
- •match (Str, Re) - возвращает позицию в строке Str, в которой располагается
- •Примеры:
- •2. Пусть в файле file.txt находятся строки:
- •В результате получаем:
- •Массивы
- •Пример.
- •В результате должно быть: John 200,
- •Однако порядок появления индексов неопределен, поэтому может возникнуть необходимость в их сортировке.
- •Такой прием очень удобен, чтобы определить, например, частоту появления
- •Пример вывода на экран: the 102
- •Здесь в первом цикле for выбирается каждое слово из входной строки и заполняется
- •Для удаления некоторого элемента из
Некоторые версии awk требуют, чтобы шаблон BEGIN был первым шаблоном программы, а шаблон END = последним
(в Linux не так).
B. Выражение “Шаблон_1, Шаблон_2” (шаблон диапазонов)
Данный шаблон может использоваться в качестве селектора, то есть указать диапазон строк.
Например, выражение
NR == 10, NR == 20 |
32 |
задает строки от 10-ой до 20-ой
включительно, то есть, выбираются строки,
начиная с первого соответствия первому
шаблону, до строки, соответствующей
первому соответствию второму шаблону.
Если второй шаблон не обнаруживается, то все остальные записи считаются соответствующими шаблону.
33
Например, в файле file.me находятся строки:
1
2
3
7
9
10
Тогда программа
awk '$1 == 3,$1 == 10' file.me
выведет строки:
34
3
7
9
10
Внимание!
Шаблоны диапазона не могут быть частями сложных шаблонов.
35
Если выражение арифметическое, то
соответствие будет иметь место в том случае, если результат будет ненулевым числом.
Если шаблон строка, то соответствие имеет место, если выражение не является нулевой строкой.
Например, шаблон $1 <= $2
может вызывать как численное, так и строковое сравнение в зависимости от содержимого полей записи.
36
C. Использование арифметических
операторов
Достоинством программы awk является ее возможность попутно с операциями над текстом проводить вычисления над входными потоками данных: что-нибудь подсчитать, вычислить суммы и средние величины и тому подобное.
Например, попытаемся определить среднюю цену всех автомобилей. Для этого используем:
37
-переменную SUM, введенную пользователем;
-переменную команды awk, называемую
NR (число записей или строк, считанных командой awk);
- оператор команды awk, называемый END. Этот оператор предписывает команде awk ожидать, пока не будут считаны все записи, а затем выполнить следующие действия.
38
cat > aw.price
Создание файла aw.price
{SUM = SUM + $3}
Суммирование всех цен
END
Ожидание считывания всех записей
{print "Aver price: ", SUM/NR} CTRL-D
Вычисление средней цены |
|
awk -f aw.price cars.file |
|
Выполнение команды awk с опцией -f. |
|
Average price: 3875.34 |
|
Выведенный результат |
39 |
В этих всех примерах использование опции -f эквивалентно набору операторов в командной строке для получения результата.
Переменная SUM не является встроенной, она определяется самим фактом использования.
По умолчанию все переменные инициируются нулем, так что не надо
беспокоиться об их инициализации.
40
Встроенные переменные awk
FILENAME |
- |
имя текущего входного |
|
|
|
|
файла, |
FS |
- |
символ разделения |
|
полей |
( по умолчанию приняты |
символы "Пробел" и "Табуляция"),
RS - символ разделения входных строк ( по умолчанию принят
символ перевода строки), |
|
||
NF |
- |
число полей входной |
|
|
|
строки, |
|
NR |
- |
номер текущей входной |
|
|
|
записи (FNR), |
41 |