Язык обработки данных AWK

Part: ОБЩАЯ ИНФОРМАЦИЯ

1. Назначение и Формат использования

AWK - утилита предназначенная для простых, механических и вычислительных манипуляций над данными. Довольно несложные операции часто необходимо выполнить над целыми пакетами файлов, а писать для этого программу на одном из стандартных языков программирования является утомительным и, как правило, не очень простым делом. Оптимальное решение проблемы - использование специальной утилиты AWK, включающей в себя не громоздкий и удобный язык программирования, позволяющий решать задачи обработки данных с помощью коротких программ, состоящих из двух-трех строк.

Утилита AWK изначально объединяла свойства утилит UNIX - sed и grep. В дальнейшем ее возможности значительно расширились. Настоящая документация ограничивается описанием возможностей утилиты AWK реализованной для компьютеров CONVEX. Утилита AWK была создана в 1977 г, американскими авторами: Alfred V.Aho, Brian W.Kernighan и Peter J.Weinberger. Подробное описание всех возможностей утилиты AWK для UNIX дает их издание: «The AWK Programming Language», 1988.

AWK сканирует input (стандартный или указываемый набор файлов), и над строками, удовлетворяющими заданному образцу, выполняет указываемые действия. Строка может содержать максимально до 256 символов.

Формат:

awk [-Fc] [-f file] [files]
awk [-Fc] [prog] [files]
prog
программа, вида: ' образец ${$действие$}$'
file
файл с AWK-программой:
образец { действие}
образец { действие}
...

files
файлы, предназначенные для AWK-обработки.
-Fc
устанавливает разделитель полей в «с» (См. 1.2.1 и 2.4)

2. Общая структура AWK-программы

  1. Язык программирования AWK допускает использование:
    • Полей;
    • Переменных (Стандартных, Массивов);
    • Арифметических выражений.
  2. Образец:
    • Регулярное выражение;
    • Выражение отношения;
    • Комбинация образцов;
    • BEGIN и END.
  3. Действие:
    • Последовательность предложений, разделенных »;» или «\n» (новая строка)

Предложение:

  1. Вывод (Печать);
  2. Присваивание;
  3. Встроенная функция;
  4. Управляющая структура.

Part: СТРУКТУРА AWK-ПРОГРАММЫ

1. Язык AWK

1.1 Поля

Каждая сканируемая строка input рассматривается как состоящая из полей, разделенных разделительными символами (по умолчанию - пробел).

На поля можно ссылаться из AWK программы следующим образом:

  1. $1 - Первое поле;
  2. $2 - Второе поле;
  3. … и так далее…
  4. $0 - Ссылается на всю строку целиком.

Строка может содержать максимально до 100 полей.

1.2 Переменные

1.2.1 Стандартные переменные

< Drawing or tabular insertion skipped…>


1.2.2 Значения переменных

Переменные могут интерпретироваться как числовые или строковые. Они принимают значения в зависимости от контекста, например:

x = 1 x воспринимается как число;
x = " " x - строка;
x + "abc" результат операции интерпретируется как число независимо от того, было ли х числом или строкой. Если строка не может быть интерпретирована как число ("abc"), то ее значение становится 0.

Строка может содержать максимально до 256 символов.

1.2.3 Переменные поля

Ссылки на поля $1, $2, … могут интерпретироваться в качестве переменных, например:

$1 = "3" + $2 первое поле принимает значение второго поля, увеличенного на 3.
$(i+1) интерпретируется как поле, номер которого зависит от значения переменной i.
1.2.4 Массивы

Допускается использование массивов. Массивы не объявляются, а принимают значения из контекста, например:

x[NR] = $0 элементу массива x, индексированному NR, присваивается обрабатываемая строка.
x["apple"] элементы массива могут индексироваться не числовым значением, т.е. строкой.

1.3 Арифметические выражения

Выражение:

  • Переменная;
  • Число;
  • Строка;
  • Встроенная функция;
  • Выражение Операция Выражение.
Операция
"+", "-", "*", "/", "%"

2. Образцы (patterns)

2.1 Регулярное выражение

Для осуществление поиска в AWK языке допускается использование регулярных выражений, определенных в описании SED, (см. «Неинтерактивный текстовый редактор SED» 2.1), заключенных в »/ /». Дополнения к использованию регулярных выражений, допускаемые в AWK-языке:

  • ( ) - Скобки допускаются для группирования;
  • | - Указание альтернативы «или»;
  • + - Плюс, стоящий за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 1;
  • ? - Знак вопроса за регулярным выражением означает 0 или 1 вхождений этого выражения;
  • [A-Z] - Допускается сокращенная форма записи для рангов ASCII символов;
  • Установленный порядок выполнения операторов на одном скобочном уровне: "[] * + ? конкатенация |".

Например:

/Olga/ Указывает на строки, содержащие Olga.
/[Oo]lga|[Mm]ike|[Mm]al/ Указывает на строки, содержащие Olga или olga или Mike или mike или Mal или mal.
/number[0-9]/ Указывает на строки, содержащие number0 или number1 или … number9.
/\/.+\// Указывает на строки, содержащие любое количество символов, больше или равное 1, заключенных в / /.

2.2 Выражение отношения

Выражение отношение может быть двух типов:

  • Выражение Принадлежность Выражение
  • Выражение Лог. Операция Выражение
Принадлежность
~ - Содержится;
!~ - Не содержится.
Лог. Операция
<, <=, ==, !=, >=, >.

Например:

$1 ~ /[Oo]lga/ Указывает на строки, первое поле которых содержит Olga или olga.
$1 >= "s" Указывает на строки, начинающиеся с символа s или следующих за ним по порядку: t, u, v

2.3 Комбинация образцов

Допускается логическая комбинация образцов с использованием следующих знаков: || - «или», && - «и», ! - «не».

Последовательности образцов, соединенных одним из знаков читаются слева направо.

Комбинация: «образец1, образец2» указывает, что действие выполняется над строками, попадающими в указанный ранг: то есть, начиная от строки, удовлетворяющей «образец1» и вплоть до строки, удовлетворяющей «образец2», включая ее саму.

Например:

/02\.95/ && ($1 !~ /\.su/ $2 !~ /\.su/) Указывает на строки, содержащие 02.95 и не имеющие .su одновременно в первом и во втором поле.
NR == 100, NR == 200 Указывает строки с номерами от 100 до 200.

2.4 BEGIN и END

Образец BEGIN указывает на начало input или на те действия, которые должны быть выполнены до какого бы то ни было анализа строк. Образец END указывает на конец input или на те действия, которые должны быть выполнены после обработки всех строк.

Например:

BEGIN {FS = ":"} Устанавливает разделитель полей в ":" до начала обработки строк. Эквивалентно опции "-F:" при AWK вызове.
END { print NR } Печатает номер последней строки input, т.е. количество обработанных входных строк.

3. Действия

3.1 Вывод (Печать)

Формат оператора печати:

PRINT [ список выражений ] [ > выражение1 ]

Если в списке выражения находятся через запятую, то значения этих выражений выводятся на output (печатаются) через символ-разделитель OFS (по умолчанию пробел). Если же выражения стоят через пробел, то на печати происходит их конкатенация.

Значение выражения1 рассматривается как имя файла. Само его присутствие означает печать в файл. Если вместо > стоит >>, то это означает добавление к уже существующему файлу. Можно использовать в одной программе максимально до 10 output файлов.

Оператор форматированной печати:

PRINTF формат [,список выражений] [ > выражение1]

формат: символьная строка в двойных кавычках. Идентичен формату, используемому в функции printf в языке «С». Формат может содержать:

  • обычные символы, они копируются на output.
  • esc-последовательности, представляющие неграфические символы, например, "\n" - новая строка.
  • спецификации для вывода аргументов, они следуют после символа »%». Число спецификаций должно быть равно числу аргументов. (Если оно меньше числа аргументов, то лишние аргументы игнорируются, если же больше - то это ошибка)

3.2 Присваивание

Оператор присваивания имеет вид:

переменная = выражение

Начальное значение переменной 0 или » » (пробел). Допускаются другие типы присваивания в соответствии с языком «С»: "+=", "-=", "*=", "/=", "%=".

переменная ++, ++ переменная - увеличение значения переменной на 1.

переменная --, -- переменная - уменьшение значения переменной на 1.

3.3 Встроенные функции

length(arg) Функция длины arg. Если arg не указан, то выдает длину текущей строки.
exp(), log(), sqrt() Математические функции экспонента, логарифм и квадратный корень.
int() Функция целой части числа.
substr(s,m,n) Возвращает подстроку строки s, начиная с позиции m, всего n символов.
index(s,t) Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)
sprintf(fmt,exp1,exp2,…) Осуществляет форматированную печать (вывод) в строку, идентично PRINTF.
split(s,array,sep) Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.

3.4 Управляющие структуры

Условное предложение:

<P><SAMP> if ( &lt </SAMP> условие<SAMP>&gt ) &lt </SAMP> предложение<SAMP>&gt </SAMP>

<P>\hskip 1cm <SAMP>[else &lt </SAMP> предложение<SAMP>&gt ]</SAMP> <P>Предложения цикла: <P><SAMP> while ( &lt </SAMP> условие<SAMP>&gt ) &lt </SAMP> предложение<SAMP>&gt </SAMP>

<P><SAMP> for (&lt </SAMP> выражение<SAMP>&gt ; &lt </SAMP> условие<SAMP>&gt ; &lt </SAMP> выражение<SAMP>&gt )</SAMP>

<P>\hskip 1cm <SAMP>&lt </SAMP> предложение<SAMP>&gt </SAMP> <P>Например: <P><SAMP> for(i=1; i&lt =NF; i++)</SAMP> - Аналогично циклу for в языке ``С'' <P><SAMP> for (i in array)</SAMP> - Цикл по элементам массива. Но, элементы массива доступны в этом случае в случайном порядке.

<P><SAMP> break</SAMP> - Немедленный выход из цикла. <P><SAMP> continue</SAMP> - Переход к выполнению следующего предложения. <P><SAMP> next</SAMP> - Немедленный переход к анализу следующей строки. <P><SAMP> exit</SAMP> - Выход из программы (на конец input). <P><SAMP>#</SAMP> - Комментарий

<P> <H1><A NAME=«22»>Part: Сравнительное решение задач с помощью SED и AWK</A></H1> Система <SAMP> UNIX</SAMP> обладает несколькими программами, которые обрабатывают входной поток данных: <SAMP> grep</SAMP>, <SAMP> egrep</SAMP>, <SAMP> fgrep</SAMP>, <SAMP> lex</SAMP> и <SAMP> sed</SAMP>. Неинтерактивный редактор <SAMP> sed</SAMP> обеспечивает выполнение в пакетном режиме большинства функций редактирования редактора <SAMP> ed</SAMP>. Как показано на примерах ниже, некоторые задачи обработки текстов могут быть решены как с помощью <SAMP> awk</SAMP>, так и с помощью <SAMP> sed</SAMP> и время решения простых задач с помощью <SAMP> sed</SAMP> будет меньше. Однако, решения некоторых примеров (как 4. и 5.) выглядят более наглядно с использованием <SAMP> awk</SAMP>. Кроме того, утилита <SAMP> awk</SAMP> безусловно шире по своим возможностям и позволяет численные манипуляции с данными, логические отношения, использование переменных и т.п., чего не обеспечивает ни одна из вышеперечисленных программ.

<P> <H2><A NAME=«23»>Примеры:</A></H2>

<H3><A NAME=«24»>1. Посчитать количество строк (input)</A></H3>

<P><SAMP> SED: $= </SAMP> (10.2 c.) <P><SAMP> AWK: END { PRINT NR } </SAMP> (15.0 c.) <P> <H3><A NAME=«25»>2. Напечатать все строки, содержащие <TT>«olga»</TT></A></H3>

<P><SAMP> SED: /olga/p </SAMP> (11.6 c.) <P><SAMP> AWK: /olga/ </SAMP> (25.6 c.) <P> <H3><A NAME=«26»>3. Напечатать все строки, содержащие <TT>«olga»</TT>, <TT>«mike»</TT> или <TT>«mal»</TT></A></H3>

<P> <PRE> SED: /olga/p

    /olga/d
    /mike/p
    /mike/d
    /mal/p
    /mal/d            (15.8 c.)

AWK: /olga\bverb mike\everb mal/ (29.9 c.) </PRE> <P> <H3><A NAME=«27»>4. Напечатать третье поле каждой строки</A></H3>

<P><SAMP> SED: /[^ ]* [ ]*[^ ]* [ ]*\([^ ]*\).*/s\1/p </SAMP> (29.0 c.) <P><SAMP> AWK: {PRINT $3} </SAMP> (33.3 c.) <P> <H3><A NAME=«28»>5. Напечатать сначала третье, а затем второе поля каждой строки</A></H3> <P><SAMP> SED: /[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\).*/s\2\1/p </SAMP> (30.5 c.) <P><SAMP> AWK: {PRINT $3 $2} </SAMP> (38.9 c.) <P> <H3><A NAME=«29»>6. Добавить строки, содержащие <TT>«olga»</TT>, <TT>«mike»</TT> или <TT>«mal»</TT> соответственно к файлам: <TT>folga, fmike, fmal</TT></A></H3>

<P> <P> <PRE> SED: /olga/w folga

       /mike/w fmike
       /mal/w fmal         (16.1 c.)

AWK: /olga/ {print &gt «folga»}

       /mike/ {print &gt  "fmike"}
       /mal/  {print &gt  "fmal"}   (46.4 c.)

</PRE> <p> <center>

<hr noshade size=1> <b><a href=«http://www.opennet.ru/docs/»>Архив документации на OpenNet.ru</a>

Статья взята отсюда.

 
programming/awk.txt · Последние изменения: 01.03.2016 в 18:18 (внешнее изменение)
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki