
- •Программирование вывода текста 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 выбирается каждое слово из входной строки и заполняется
- •Для удаления некоторого элемента из
В операторе print фрагменты, отделяемые запятой, печатаются через символы разделения полей выходного потока, которые по умолчанию служат пробелами.
Напоминание:
print “” печатает пустую строку, а
print без аргументов печатает текущую строку ввода.
21
Для полного контроля над выходным потоком используется оператор printf,
сходный с аналогичной функцией в языке
Си.
Например, в строке
awk '{printf "%4d %s\n", NR,$0}'
выражение %4d задает поле в четыре цифры для вывода целого NR в десятичном представлении,
а выражение %s - строка символов для
вывода $0 и \n - символ перевода строки ( он нужен, так как printf не задает
автоматически пробелы или символы
перевода строк). |
22 |
За каждым оператором print или printf может следовать символ > и имя файла
(в виде строки в кавычках или переменной). В этом случае выходной поток будет направлен в этот файл.
Может использоваться и символ >> для
дописывания в файл.
4.Шаблоны
А.Наиболее типичное использование шаблонов в программе awk сводится к задачам простой проверки данных, обычно это поиск строк, удовлетворяющих и неудовлетворяющих некоторому условию23 .
Если нет выходного потока, то считается, что данные удовлетворяют соответствующему критерию.
Например, шаблон для проверки - является ли второе поле строки пустым - может выглядеть следующим образом:
$2 = "" второе поле пусто $2 !~/./ второе поле не содержит ни одного символа
length ($2) == 0 длина второго поля
равна нулю.
24
Символ ~ обозначает соответствие регулярному выражению, а символы !~ - отсутствие соответствия.
Само регулярное выражение заключено в символы дробной черты (слеши).
Соответствие можно записывать несколькими способами.
1. Заключение строки в символы наклонной черты.
Например, /Anna/ или /"Anna"/
25
Причем необходимо помнить, что это разные шаблоны.
В первом шаблоне ищется просто слово Anna, а во втором - слово Anna, заключенное в двойные кавычки.
Поиск будет удачен при нахождении шаблона в любом месте строки ввода.
Причем, никакие знаки отмены не используются.
26
2. Операция ~ (соответствие) Например,
$2 ~ /mm/
или $2 ~ "mm"
Соответствие с шаблоном имеет место, когда проверяемое поле содержит подстроку в правой части.
В данном примере отыскивается соотвествие mm в любом месте второго поля.
27
3. Операция !~ (не соответствие) Например, $2 !~ /mm/
Данный пример соответствует всем записям ввода, которые не содержат mm
где-либо во втором поле.
Примечание: |
|
|
/Anna/ |
эквивалентно |
$0 ~ /Anna/ |
28
В шаблонах можно применять метасимволы, как и в функции grep:
.- любой символ;
* |
- |
любое число повторений |
предыдущего символа; |
||
^ |
- |
начало слова или строки; |
$ |
- |
конец слова или строки. |
Внимание!
Не путать метасимволы шаблонов и метасимволы командной строки - "*" и "?".
29
A. Шаблоны BEGIN и END
Программа awk имеет два специальных шаблона: BEGIN и END.
Действие, соответствующее BEGIN, выполняется прежде, чем читается первая входная строка.
Его можно использовать для инициации переменных, печати заголовков или для установки символа разделения полей,
присваивая его переменной FS.
30
awk 'BEGIN { FS=":"} $2 == "" ' file.my
Здесь в файле file.my проверяется в каждой строке на пустоту второго поля.
Действия, указанные в шаблоне END, выполняются после обработки последней входной строки:
awk 'END {print NR}' .....
Здесь печатается число строк входного потока.
31