|   | Мы — долго запрягаем, быстро ездим, и сильно тормозим. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|    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