530 likes | 629 Views
AWK (GAWK). (манипулирование файлами данных, выборка и обработка текста ). Преподаватель: Петриков Владимир Дмитриевич. Инструмент прикладного программиста: строковый процессор AWK. The AWK Programming Language , авторы A ho, W einberger и K ernighan
E N D
AWK(GAWK) (манипулирование файлами данных, выборка и обработка текста) Преподаватель: Петриков Владимир Дмитриевич
Инструмент прикладного программиста: строковый процессор AWK The AWK Programming Language, авторы Aho, Weinberger и Kernighan известны, как родоначальники языка C и операционной системы UNIX. много реализаций - разные ОС: UNIX, WIN, MAC Gawk - это GNU реализация AWK mawk, … - новыйAWK
ПРИМЕР 1 Разбор файлов задачного сервера 2006 -2008. Имеется Набор каталогов со сданными решениями и набор файлов с протоколами результатов Необходимы файлы – по именамстудентов по номерам задач
Значительная обычная доля работы программиста - преобразовании текстовых файлов: выделении из них определенных частей, преобразовании одних строк в другие, дописывании какой-либо информации, простейшие вычисления с данными, извлекаемыми из этих файлов и т.д., и т.п. Трудоемкость - тысячи строк текста Неунифицируемость - информация не структурирована Для эффективной работы в этой ''серой'' области давно предложен и с успехом применяется строковый процессор awk.
ПРИМЕР 2 Преобразование Списка для разных задач.
Почти C Для своих действий awk предоставляет в распоряжение программиста развитый язык программирования, напоминающий популярный язык программирования C. Входной язык процессора awk является в определенном смысле ''упрощенным'' C , предоставляя удобный операционный синтаксис для строковых операций, автоматическое преобразование строка-число, автоматический лексический разбор входного потока и т.п.
Бонус Одна из самых замечательных особенностей Perl состоит в том, что он представляет собой семантическое надмножество (как минимум) языкаawk. С практической точки зрения это значит, что если вы можете сделать что-либо вawk, вы сможете сделать это и в Perl.
Запуск awk-программы Если программа короткая, проще всего включить ее в команду выполнения awk: Linux: awk 'program' input-file1 input-file2 ... WIN: gawk “program” input-file1 input-file2 ... Если программа длинная, обычно удобнее записать ее в файл : gawk -f program-file input-file1 input-file2 ... нет input-file1 ввод со стандартного устройства ввода ( win: клавиатура , CTRL-Z )
Технология выполнения заданий ОС: Windows Файловый менеджер: Total Commander Задание : в отдельном каталоге Набор файлов: Zapusk.bat gawk -f p2.awkspisok.txt >new.txt Запуск примера из командного окнатекущего каталога: набрать в TotalCommander внизу - cmd Запуск: >zapusk Редактируем файлp2.awk
A B C E EOF - именованная последовательность логических записей, хранящихся на внешнем носителе. Файл запись конца файла Текущая позиция Предыдущая запись Следующая запись (RECORD) Запись - набор знаков, значений; читается или записываетсяцеликом.
поле1 FS поле 2 FS FS FS RS Работа awk AWK рассматривает входной поток данных : это записи(строки), разделенные специальными символами (RS - RecordSeparator) - переход на новую строку ('\n'). Запись (строка) считается разделенной на поля специальными символами (FS - FieldSeparator) - по умолчанию - символ пробела Строка <= 256 символов. $0 \n пробел
Структура awk-файла Программа на языке awk состоит из пар: образец действие. (шаблон действие) Каждая запись проверяется встроенным механизмом awk на соответствие заданному образцуи если текущая запись соответствует этому образцу, выполняется действие. , т.е. интерпретация входной информации идёт построчно …………. Входной Файл …………. выполняется много раз Программа см. Пример 3 - запуск из файла
шаблон {действие } чего-то нет шаблон {действие} действие выполняется для каждой записи шаблон{ print } вывод всей записи для каждого шаблона Сравним примеры 3 и 3а /Иванов/ { if( $0~/Иванов/ ) print $0}
Общее в AWK образец {действие} допускается использование в -- Поля (см.выше) для входных записей -- Переменные (стандартные, Массивы) -- Арифметические выражения
Образец (шаблон) -- Регулярное выражение -- Выражение отношения -- Комбинация образцов -- BEGIN и END
Действие предложения, разделенные ; или \n (новая строка) Вывод (Печать) Присваивание Управляющая структура Встроенная функция
Комментарии Общее в awk - начинаются с символа ``#'' и продолжаются до конца строки. # Print list of word frequencies { for (i = 1; i <= NF; i++) freq[$i]++ #массив слов } END { for (word in freq) printf "%s\t%d\n", word, freq[word] } pr4 pr4a
Поля Общее в awk строка ВВОДА состоит из полей строка: Первоеполе Второеполе ……… $0 $1 $2 …. $100$101 максимально Ссылается на всю строку целиком Запись (строка) считается разделенной на поля специальными символами (FS - FieldSeparator) - по умолчанию - символ пробела
Поля Общее в awk NR – Number of Record NF – Number of Fields число полей номер строки Record: Первоеполе Второеполе ……… Последнееполе $0 $1 $2 …. gawk “{ print NR }” new.txt gawk “{ print NR NF}” new.txt !!! Вывод Без пробела: NRNF
Переменные Общее в awk умолчание x = 1 - число = 0 x = “ab”- строка = “” y + “abc” - число y“abc” - строка
Поля как переменные Общее в awk $1 = "3" + $2 используем значение поля меняем значение поля n = 5 $(n+1) вычисляемый номер поля
Общее в awk Массивы не объявляются { x[1] = 1 x[3] = $0 } END{ print x[1] print x[3] } используются элементы массива, «как переменные» # подсчёт частоты слов { for (i = 1; i <= NF; i++) freq[$i] = freq[$i]+1#массив «слов» } индексация не числом, а полем (строкой)
Общее в awk Арифметические выражения Выражение < Операция> Выражение Переменная (Число - Строка) Число Строка Встроенная функция Выражение (константы) + - * / % остаток Операция склейка строк константы строка строка x = 1.2 - число z = “ab”“cde” z = “abcde” x = “ab”- строка
Образец (шаблон) -- Регулярное выражение -- Выражение отношения -- Комбинация образцов -- BEGIN и END
Регулярное выражение шаблон позволяет более точно описать класс строк, которые необходимо обработать или напечатать. Программа ( с пустым действием) /Иванов/ напечатает из текстового файла те строки, которые содержат подстроку "Иванов" ( в том числе и "Ивановский машиностроительный завод" ). см. Пример 3
ИСТИНА и ЛОЖЬв AWK из C ИСТИНА - любое число, отличное от 0 или любая непустая строка ЛОЖЬ – число 0 или пустая строка “” "0" – истина , т.к. строка не пустая
Выражение отношения шаблон < Выражение> < Принадлежность> < Выражение> < Выражение> < Лог. Операция> < Выражение> ~ Содержится !~ Не содержится < <= == != >= > n >= 5 $0~/Иванов/ $1 >= "s" в строке содержится “Иванов” s, t, u, v... строки, начинающиеся с символа s или следующих за ним по порядку
шаблон Логические операции < Выражение> < Лог. Операция> < Выражение> && Логическое И || Логическое ИЛИ ! Логическое НЕ (отрицание) $0~/Иванов/ || $0~/Петров/ n >= 5 && n<10 в строке содержится “Иванов” или “Петров” n = 5, 6, 7, 8, 9
BEGIN и END шаблон выполняется 1 раз BEGIN { } Входной файл выполняется много раз = количеству строк Программа END { } выполняется 1 раз BEGIN { printf “СТАРТ\n” } /Иванов/ END { printf “\nФИНИШ”}
Регулярное выражение /Иванов/ метасимволы (шаблоны) шаблон ^ $ [ ] - + * .(точка) \ ^ -- соответствует началу строки /^A/ - строки, начинающиеся на A $4 ~ /^Иванов/ $ -- соответствует концу строки. /A$/ отвечает строкам, заканчивающимся на A. $4 ~ /вна$/ "^$"соответствует пустой строке.
шаблон [ ] -- множество единичных символов [AWK] соответствует множеству из трех букв A, W, K G[AWK] представляет множество строк { GA, GW, GK } --- задаёт диапазон символов (нет переносимости POSIX!) [a-z] соответствует символам от a до z, {a b c d … y z} $4 ~ /^[А-С]/
шаблон + -- многократное ( не менее одного) повторение в образце символа, предшествующего + [1-9]00+ -- целые числа, делящиеся на 100 {100 200 …900 1000 …} *-- также многократное, но возможно также и нулевое повторение предыдущего символа. [1-9][0-9]* -- положительные целые числа. {1 2 … 10 …100 …} [1-9]00* -- целые числа, делящиеся на 10 {10 20 …90 100 …} ?-- однократное, но возможно также и нулевое повторение предыдущего символа. [1-9][0-9]?-- положительные целые числа до 99 {1 2 … 10 …99}
шаблон • .(точка) -- произвольный единичный символ • .*- обозначает произвольную • комбинацию символов. • "13." - 131 133 134 13_ 13\n 13 • \ -- отменяет специальное значение • последующего символа. • \$ - это символ $ • \\ - это символ \
Управляющие последовательности для символов ASCIIс кодами 0 - 31 \a 0x07 BEL Звуковой сигнал Bell \b 0x08 BS Забой Back Space \f 0x0C FF Перевод бланка Form Feed \n 0x0A LF Новая строка (перевод строки) (new line) Line Feed \r 0x0D CRВозвраткареткиCaridge Return \t 0x09 HT Табуляция (горизонтальная) \v 0x0B VT Вертикальная табуляция
Символы, используемые в разных «шаблонах» printf("Hello Word !!! \n"); как напечатать\ “ ? \\ 0x5c \ Обратная наклонная черта \/ / Прямая наклонная черта \' 0x27 ' Одинарная кавычка (апостроф) \" 0x22 " Двойная кавычка \? 0x3F ? Вопросительный знак Универсальный способ \ddd строка до трех восьмеричных цифр (0 - 377) \xdd строка шестнадцатеричных цифр (0 - FF)
Действие предложения, разделенные ; или \n (новая строка) Вывод (Печать) Присваивание n = 1 Управляющая структура Встроенная функция
действие Вывод (Печать) print - выводится вся запись + \n print $0 print $1, $2 - значения полей выводятся через пробел print $1 “abc” - выводится конкатенация значений полей print “”– выводитсяпустая строка формат вывода – по умолчанию
действие форматированный вывод printf format, item1, item2, ... функция sprintf(format, item1, item2, ...)
Управляющие операторы действие if (условие) оператор [ else оператор] while (условие) оператор do оператор while (условие) for (выражение1; выражение2; выражение3) оператор for (переменная in массив) оператор break continue delete массив[индекс] delete массив exit [ выражение ] { операторы }
if (если) действие if( условие ) действие if( условие ) действиеelseдействие Анализ условия на истинность, ==0 if (x % 2 == 0) print "x is even" else print "x is odd"
while (пока) действие while (условие ) действие выполнение действия пока значение условия !=0 проверка перед каждым выполнением { i = 1 while(i <= 3){ print $i i=i+1 } }
действие do (делай ) do действие while ( условие ) { i = 1 do { print $0 i++ } while (i <= 10) }
for (для) действие for (инициализация; условие; приращение) действие for (i = 1; i <= 100; i = i + 2) print i инициализациязадает инициализацию цикла while (условие) проверка перед каждой итерацией { действие приращениечасть итерации }
for (для) действие for (переменная in массив) действие # Пишем 1 для каждого встречного слова { for (i = 1; i <= NF; i++) used[$i] = 1 } # Ищем количество разных слов длиннее 10 знаков END { for (x in used) if (length(x) > 10) { num = num +1 } print num, "words longer than 10 characters" }
действие break (прерывание) – «досрочный» выход из цикла break - для do, while, for continue (продолжение) – новая итерация - выполнение нового цикла continue
Встроенные функции действие Математические функции exp() – экспонента log() - натуральныйлогарифм sqrt()- квадратный корень int() - целая часть числа
Строковые функции действие length(arg)- Функция длины arg. length - длина текущей строки substr(s, m, n) - Возвращает подстроку строки s, начиная с позиции m, всего n символов. index(s, t) - Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)