Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
www.lissyara.su
—> документация
|
|
Частные случаи:
{действие} - когда действие выполняется для всех строк.
шаблон - когда выводятся строки с данным шаблоном.
Действие может состоять из последовательности операторов, разделяемой ";" или переводом строки или закрывающей скобкой.
Возможны комментарии (как в shell "#.........").
Пример:
Для дальнейших примеров возьмем входной файл "f-awk" ( фамилия инициалы год-приема-на-работу возраст ):
|
|
Результат:
|
Существует два оператора специального вида ("BEGIN"-начальные установки и "END" - "последействия"):
|
2. ВЫЗОВ awk
Возможны два основных варианта:
1)
|
Это простейший случай, когда программа (заключенная в кавычки " ' ") находится в теле команды,
-Fc - флаг, меняющий стандартный разделитель полей на "c"
file - имя файла исходных данных, при его отсутствии - со стандартного входа. (Этот формат использован в начальных примерах).
|
и
|
дают результат, аналогичный
|
Для демонстрации действия флага "-Fc" рассмотрим вызовы:
|
На экран будет выведено:
|
Первая команда awk выведет вторые поля (благодаря позиционной переменной "$2") строк, содержащие "до". (Кстати, позиционная переменная "$0" соответсвует всей строке).
Во втором случае, благодаря флагу "-F" стандартные разделители заменены на символ "0", т.е. теперь выбранные строки воспринимаются, как разбитые на следующие поля:
|
2)
|
Флаг "-f" говорит о том, что awk-программу надо брать из файла, имя которого указано следом (имя может быть произвольным и расширение ".awk" добавлено здесь просто из эстетических соображений).
3. awk-ПЕРЕМЕННЫЕ И ВЫРАЖЕНИЯ
В языке awk выделяются две группы переменных:
предопределенные и декларированные в программе. Исходные значения предопределенных переменных устанавливаются интерпретатором awk в процессе запуска и выполнения awk-программы.
К предопределенным относятся: Умолчания:
NR номер текущей строки;
NF число полей в текущей строке;
RS разделитель строк на вводе; "\0"
FS разделитель полей на вводе; пробел и/или табуляция
ORS разделитель строк на выводе; RS
OFS разделитель полей на выводе; FS
OFMT формат вывода чиcл; "%.6g"
FILENAME имя входного файла.
Прочим переменным пользователь может присваивать начальные значения. По умолчанию "0" или пустая строка (что здесь равнозначно!).
Типы переменных:
— позиционные,
— числа с плавающей точкой,
— строка символов,
— массив.
Интерпретатор awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции:
— если пробел (конкатенация), то строки;
— если "+", то числа с плавающей точкой.
Примеры:
|
Результат:
|
|
Результат:
|
Массив не объявляется, а начинает существовать в момент первого использования. Индекс массива - любое ненулевое значение или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу, а по совпадению содержания, например:
|
Массивы удобно использовать при суммированиях, например записи выплат имеют вид (файл "p-1"):
|
|
Результат (поименный нарастающий итог):
|
Операции как в Си:
=, +=, -=, *=, /=, %=, +, /, %, ++, --.
Сравнения чисел, если оба числа, иначе - строк:
<, <=, ==, !=, >=, >
Логические операции:
!, ||, &&
Операция "пробел" - конкатенация.
4. ПРИМЕРЫ awk-ПРОГРАММ
1)
|
Результат:
|
2)
|
Результат:
|
3)
|
Результат:
|
4)
|
Результат:
|
5)
|
Результат:
|
Значение позиционной переменной "пусто" после окончания просмотра)
|
5. СЕЛЕКТОРЫ
Здесь "селектор" следует понимать, как расширение понятия "шаблон", поскольку там где в структуре команды указан шаблон, в общем случае может стоять любой селектор.
ЗАМЕЧАНИЕ. Открывающая скобка действия "{" должна быть в строке селектора.
В качестве селектора может быть:
1) выражение;
2) шаблон;
3) их комбинация.
Соответсвующие примеры:
1)
|
2)
|
Пример:
|
|
3) Шаблон может формировать множество образцов или указывать, в каком месте поля искать:
/^a/ - поле начинается с "a"
/a$/ - поле кончается "a"
\+ - экранирует оператор
[abc] - любой из символов "a", "b" и "c"
[a-р] - любой символ диапазона
* - 0 или больше вхождений регулярного выражения
+ - 1 или больше вхождений регулярного выражения
? - 0 или 1 вхождение регулярного выражения
ab|cd - "ab" или "cd"
Примеры сочетаний:
|
Результат:
|
То есть в третьем поле выделить 70-е годы (7 и еще одна цифра от конца поля).
6. ЕЩЕ ПРИМЕРЫ
1)
|
Результат:
|
2)
|
Результат:
|
3)
|
Результат:
|
4)
|
Результат:
|
5)
|
Результат:
|
6)
|
Результат:
|
7. ДЕЙСТВИЯ
В awk возможны следующие действия:
1) присваивания выражений;
2) операторы управления
3) операторы вывода;
4) встроенные функции.
ОПЕРАТОРЫ УПРАВЛЕНИЯ
Простейшие операторы
exit - завершить выполнение программы;
next - перейти к следующей строке, управление на начало awk-программы;
break - выход из цикла;
continue - переход к следующей итерации;
Структурные операторы
|
Структурные операторы в значительной степени аналогичны соответсвующим операторам Си.
В последнем случае для каждого индекса выполняется блок. Текстовые индексы рассматирваются в лексикографическом порядке.
Примеры
1)
|
Результат:
|
2)
|
Результат:
|
Здесь, кроме изменения очередности полей в строке на противоположное (что делает цикл "for"), предварительно устанавливается выходной разделитель - пробел и весь результат предварительно выдается в одну строку, поэтому после обработки каждой строки выдается команда "print RS" для перевода выходной строки. Редактор sed подключен через конвейер, чтобы убрать возможные пробелы в начале строки.
Существенная деталь. Если запустить лишь базовую структуру
|
то все поля исходной таблицы с изменениями порядка внутри прежних строк получим вытянутыми в один столбец переводом строки:
|
Однако, если поставим ";" сразу после условия, т.е. сделаем пустое тело цикла, за пределы которого вынесен "print $k"
|
то получим исходную таблицу
|
поскольку "$k" после выхода из цикла будет иметь значение "0", а "$0" - соответсвует всей строке в качестве значения(!), то "print $k" будет после каждого цикла печатать полные строки.
8. ВВОД И ВЫВОД ДАННЫХ
В общем случае в команде awk может быть указано несколько файлов.
Напомним форматы вызова команды:
|
Файлы обрабатываются последовательно в указанном порядке.
Это можно использовать для "настройки" awk команды при обработке последующих файлов.
Пусть файл "f0" имеет вид:
|
А файл awk-программы "prim.awk" имеет вид:
|
Тогда при вызове команды
|
Результат:
|
То есть второе поле файла "f0" дает значение переменной "w1", а первое - "w2". Эти переменные используются в селекторах при обработке файла "f-awk".
Изменим программу в файле "f-awk":
|
Результат:
|
Если исключить первый оператор "next", то в выходном файле появится дополнительно первая строка:
|
поскольку выбирается снова первое поле в певом файле ("f0").
Если исключить и второй "next", то в выходном файле появится дополнительно последняя строка:
|
которая ранее не выводилась, так как в предшествующий оператор "{ print ("фамилия: "$1)}" заканчивал работу на последней строке файла "f-awk", поэтому "next" пропускал последующую командную строку
|
И еще одна модификация в связи с вводом данных с терминала. Вызов команды будет:
|
А файл "prim.awk" примет вид:
|
9. ВСТРОЕННЫЕ ФУНКЦИИ
Встроенные функции:
sin (expr) синус expr
cos (expr) косинус expr
exp (expr) возведение в степень expr
log (expr) натуральный логорифм expr
sqrt (expr) извлечение корня expr
int (expr) целая часть числа
length (s) длина строки s
printf (fmt, ...) форматирование (аналогично Си) по спецификации fmt.
substr (s, m, n) подстрока в n символов строки s, начинающаяся с m.
getline () чтение следующей строки. 0 - конец файла, иначе 1.
index (s1, s2) номер позиции, с которой s1 совпадает с s2, иначе 0.
split (s, M, c) строка s разбивается элементы массива M по разделителю c (по умолчанию FS=" "); функция возвращает число полей.
Примеры.
1)
|
Результат:
|
Здест поля разделяются по ".", выбираются строки у которых длина первого поля больше 8-ми, и их длина "length ($1)" печатается перед строкой "$0".
2)
|
Результат:
|
3)
|
Результат:
|
Поскольку все строки были выровнены пробелами, а в длине строки учитываются все символы до конца строки.
4)
|
Результат:
|
(Aho, Weinberg, Kernigan)
Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.
© lissyara 2006-10-24 08:47 MSK