53
(манипулирование файлами данных, выборка и обработка текста ) Преподаватель: Петриков Владимир Дмитриевич AWK (GAWK)

(манипулирование файлами данных, выборка и обработка текста )

Embed Size (px)

DESCRIPTION

AWK (GAWK). (манипулирование файлами данных, выборка и обработка текста ). Преподаватель: Петриков Владимир Дмитриевич. Инструмент прикладного программиста: строковый процессор AWK. The AWK Programming Language , авторы A ho, W einberger и K ernighan - PowerPoint PPT Presentation

Citation preview

Page 1: (манипулирование файлами данных, выборка и обработка текста )

(манипулирование файлами данных, выборка и обработка текста )

Преподаватель:

Петриков Владимир Дмитриевич

AWK (GAWK)

Page 2: (манипулирование файлами данных, выборка и обработка текста )

Инструмент прикладного программиста: строковый процессор AWK

The AWK Programming Language, авторы Aho, Weinberger и Kernighan известны, как родоначальники языка C и операционной системы UNIX.

Gawk - это GNU реализация AWK mawk, … - новый AWK

много реализаций - разные ОС: UNIX, WIN, MAC

Page 3: (манипулирование файлами данных, выборка и обработка текста )

ПРИМЕР 1

Разбор файлов задачного сервера2006 -2008. Имеется Набор каталогов со сданными решениями и набор файлов с протоколами результатов

Необходимы файлы – по именам студентов по номерам задач

Page 4: (манипулирование файлами данных, выборка и обработка текста )

Значительная обычная доля работы программиста - преобразовании текстовых файлов: выделении из них определенных частей, преобразовании одних строк в другие, дописывании какой-либо информации, простейшие вычисления с данными, извлекаемыми из этих файлов и т.д., и т.п.

Трудоемкость - тысячи строк текстаНеунифицируемость - информация не структурирована

Для эффективной работы в этой ''серой'' области давно предложен и с успехом применяется строковый процессор awk.

Page 5: (манипулирование файлами данных, выборка и обработка текста )

ПРИМЕР 2

Преобразование Спискадля разных задач.

Page 6: (манипулирование файлами данных, выборка и обработка текста )

Для своих действий awk предоставляет в распоряжение программиста развитый язык программирования, напоминающий популярный язык программирования C.

Входной язык процессора awk является в определенном смысле ''упрощенным'' C ,предоставляя удобный операционный синтаксис для строковых операций, автоматическое преобразование строка-число, автоматический лексический разбор входного потока и т.п.

Почти C

Page 7: (манипулирование файлами данных, выборка и обработка текста )

Одна из самых замечательных особенностей Perl состоит в том, что он представляет собой семантическое надмножество (как минимум) языка awk.

С практической точки зрения это значит, что если вы можете сделать что-либо в awk, вы сможете сделать это и в Perl.

Бонус

Page 8: (манипулирование файлами данных, выборка и обработка текста )

Если программа короткая, проще всего включить ее в команду выполнения awk: Linux: awk 'program' input-file1 input-file2 ... WIN: gawk “program” input-file1 input-file2 ...

Если программа длинная, обычно удобнее записать ее в файл : gawk -f program-file input-file1 input-file2 ...

Запуск awk-программы

нет input-file1 ввод со стандартного устройства ввода( win: клавиатура , CTRL-Z )

Page 9: (манипулирование файлами данных, выборка и обработка текста )

Технология выполнения заданий

ОС: Windows

Файловый менеджер: Total CommanderЗадание : в отдельном каталоге

Zapusk.bat gawk -f p2.awk spisok.txt > new.txt

Набор файлов:

Запуск примера из командного окна текущего каталога:набрать в TotalCommander внизу - cmdЗапуск: >zapusk

Редактируем файл p2.awk

Page 10: (манипулирование файлами данных, выборка и обработка текста )

Файл - именованная последовательность логических

записей, хранящихся на внешнем носителе.

A   B   C   E           EOF  

Следующая запись (RECORD)

Текущая позиция

Предыдущая запись

запись конца файла

Запись - набор знаков, значений; читается или записывается целиком.

Page 11: (манипулирование файлами данных, выборка и обработка текста )

AWK рассматривает входной поток данных : это записи (строки), разделенные специальными

символами (RS - RecordSeparator) - переход на новую строку ('\n').

Запись (строка) считается разделенной

на поля специальными символами (FS - FieldSeparator) - по умолчанию - символ пробела

Строка <= 256 символов.

Работа awk

поле1

FS

поле2

FS

FS

FS

        RS

$0

пробел \n

Page 12: (манипулирование файлами данных, выборка и обработка текста )

Структура awk-файлаПрограмма на языке awk состоит из пар: образец     действие.

(шаблон     действие)Каждая запись проверяется встроенным механизмом awk на соответствие заданному

образцу и если текущая запись соответствует

этому образцу, выполняется действие. , т.е. интерпретация входной информацииидёт построчно

см. Пример 3 - запуск из файла

Программа

………….ВходнойФайл………….

выполняетсямного раз

Page 13: (манипулирование файлами данных, выборка и обработка текста )

шаблон      { действие }

шаблон { действие }

чего-то нет

действие выполняется для каждой записи

шаблон { print }

вывод всей записи для каждого шаблона

Сравним примеры 3 и 3а

{ if( $0 ~ /Иванов/ ) print $0 }/Иванов/

Page 14: (манипулирование файлами данных, выборка и обработка текста )

Общее в AWK

допускается использование в

-- Поля (см.выше) для входных записей

-- Переменные (стандартные, Массивы) -- Арифметические выражения

образец     {действие}

Page 15: (манипулирование файлами данных, выборка и обработка текста )

Образец (шаблон)

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

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

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

-- BEGIN и END

Page 16: (манипулирование файлами данных, выборка и обработка текста )

Действие

предложения, разделенные ; или \n (новая строка)

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

Page 17: (манипулирование файлами данных, выборка и обработка текста )
Page 18: (манипулирование файлами данных, выборка и обработка текста )

- начинаются с символа ``#'' и продолжаются до конца строки.

Комментарии

# 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]}

pr4pr4a

Общее в awk

Page 19: (манипулирование файлами данных, выборка и обработка текста )

Поля

строка ВВОДА состоит из полей

строка: Первоеполе Второеполе ……… $0 $1 $2 …. $100 $101

Ссылается на всю строку целиком

Запись (строка) считается разделенной на поля специальными символами (FS - FieldSeparator) - по умолчанию - символ пробела

максимально

Общее в awk

Page 20: (манипулирование файлами данных, выборка и обработка текста )

Поля

Record: Первоеполе Второеполе ……… Последнееполе $0 $1 $2 ….

Общее в awk

NR – Number of Record

номер строки

NF – Number of Fields число полей

gawk “{ print NR }” new.txt

gawk “{ print NR NF}” new.txt !!! Вывод Без пробела: NRNF

Page 21: (манипулирование файлами данных, выборка и обработка текста )

Переменные

x = 1 - число

x = “ab” - строка

y + “abc” - число

умолчание

= 0

= “”

Общее в awk

y “abc” - строка

Page 22: (манипулирование файлами данных, выборка и обработка текста )

Поля как переменные

$1 = "3" + $2

меняем значение поля

n = 5$(n+1)

вычисляемый номер поля

Общее в awk

используем значение поля

Page 23: (манипулирование файлами данных, выборка и обработка текста )

Массивы

{ 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

Page 24: (манипулирование файлами данных, выборка и обработка текста )

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

Выражение < Операция> Выражение

Переменная (Число - Строка)Число СтрокаВстроенная функция Выражение

(константы)

+ - * / % остаток

Общее в awk

x = 1.2 - число

x = “ab” - строка

константы

строка строка

Операция склейка строк

z = “ab” “cde”

z = “abcde”

Page 25: (манипулирование файлами данных, выборка и обработка текста )
Page 26: (манипулирование файлами данных, выборка и обработка текста )

Образец (шаблон)

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

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

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

-- BEGIN и END

Page 27: (манипулирование файлами данных, выборка и обработка текста )

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

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

Программа ( с пустым действием)     /Иванов/ напечатает из текстового файла те строки, которые содержат подстроку "Иванов" ( в том числе и "Ивановский машиностроительный завод" ).

см. Пример 3

шаблон

Page 28: (манипулирование файлами данных, выборка и обработка текста )

ИСТИНА и ЛОЖЬ в AWK

из C

ИСТИНА - любое число, отличное от 0 или любая непустая строка

ЛОЖЬ – число 0 или пустая строка “”

"0" – истина , т.к. строка не пустая

Page 29: (манипулирование файлами данных, выборка и обработка текста )

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

< Выражение> < Принадлежность> < Выражение> < Выражение> < Лог. Операция> < Выражение>

~ Содержится !~ Не содержится

< <= == != >= >

$0 ~ /Иванов/$1 >= "s"

n >= 5

s, t, u, v...

шаблон

в строке содержится “Иванов”

строки, начинающиеся с символа s или следующих за ним по порядку

Page 30: (манипулирование файлами данных, выборка и обработка текста )

Логические операции

< Выражение> < Лог. Операция> < Выражение>

$0 ~ /Иванов/ || $0 ~ /Петров/ n >= 5 && n<10

n = 5, 6, 7, 8, 9

шаблон

в строке содержится “Иванов” или “Петров”

&& Логическое И

|| Логическое ИЛИ

! Логическое НЕ (отрицание)

Page 31: (манипулирование файлами данных, выборка и обработка текста )

BEGIN и END

BEGIN { }

END { }

ПрограммаВходнойфайл

выполняется 1 раз

выполняется 1 раз

выполняетсямного раз =количествустрок

BEGIN { printf “СТАРТ\n” } /Иванов/ END { printf “\nФИНИШ”}

шаблон

Page 32: (манипулирование файлами данных, выборка и обработка текста )

метасимволы (шаблоны)

^ $ [ ] - + * .(точка) \

^ -- соответствует началу строки /^A/ - строки, начинающиеся на A $4 ~ /^Иванов/

$ -- соответствует концу строки. /A$/ отвечает строкам, заканчивающимся на A. $4 ~ /вна$/

шаблонРегулярное выражение /Иванов/

"^$" соответствует пустой строке.

Page 33: (манипулирование файлами данных, выборка и обработка текста )

[ ] -- множество единичных символов [AWK] соответствует множеству из трех букв A, W, K G[AWK] представляет множество строк { GA, GW, GK }

- -- задаёт диапазон символов (нет переносимости POSIX!)[a-z] соответствует символам от a до z, {a b c d … y z} $4 ~ /^[А-С]/

шаблон

Page 34: (манипулирование файлами данных, выборка и обработка текста )

+ -- многократное ( не менее одного) повторение в образце символа, предшествующего +

[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}

шаблон

Page 35: (манипулирование файлами данных, выборка и обработка текста )

.(точка) -- произвольный единичный символ

.* - обозначает произвольную комбинацию символов. "13." - 131 133 134 13_ 13\n 13

\ -- отменяет специальное значение последующего символа. \$ - это символ $ \\ - это символ \

шаблон

Page 36: (манипулирование файлами данных, выборка и обработка текста )

Управляющие последовательности для символов 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 Вертикальная табуляция

Page 37: (манипулирование файлами данных, выборка и обработка текста )

\\ 0x5c \ Обратная наклонная черта \/ / Прямая наклонная черта \' 0x27 ' Одинарная кавычка (апостроф) \" 0x22 " Двойная кавычка \? 0x3F ? Вопросительный знак

Символы, используемые в разных «шаблонах»

printf("Hello Word !!! \n"); как напечатать \ “ ?

\ddd строка до трех восьмеричных цифр (0 - 377)\xdd строка шестнадцатеричных цифр (0 - FF)

Универсальный способ

Page 38: (манипулирование файлами данных, выборка и обработка текста )
Page 39: (манипулирование файлами данных, выборка и обработка текста )

Действие

предложения, разделенные ; или \n (новая строка)

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

Page 40: (манипулирование файлами данных, выборка и обработка текста )

действие

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

print - выводится вся запись + \n print $0

print $1, $2 - значения полей выводятся через пробел

print $1 “abc” - выводится конкатенация значений полей

print “” – выводится пустая строка

формат вывода – по умолчанию

Page 41: (манипулирование файлами данных, выборка и обработка текста )

действие

форматированный вывод

printf format, item1, item2, ...

функция sprintf(format, item1, item2, ...)

Page 42: (манипулирование файлами данных, выборка и обработка текста )

Управляющие операторы

if (условие) оператор [ else оператор]

while (условие) оператор

do оператор while (условие)

for (выражение1; выражение2; выражение3) оператор for (переменная in массив) оператор

break continue delete массив[индекс] delete массив exit [ выражение ] { операторы }

действие

Page 43: (манипулирование файлами данных, выборка и обработка текста )

if (если) if( условие ) действие

if( условие ) действие else действие

Анализ условия на истинность, == 0

if (x % 2 == 0) print "x is even"else print "x is odd"

действие

Page 44: (манипулирование файлами данных, выборка и обработка текста )

while (пока) while (условие ) действие

выполнение действия пока значение условия != 0проверка перед каждым выполнением

{ i = 1 while( i <= 3) { print $i i=i+1 }}

действие

Page 45: (манипулирование файлами данных, выборка и обработка текста )

do (делай )

do действие while ( условие )

{ i = 1 do { print $0 i++ } while (i <= 10)}

действие

Page 46: (манипулирование файлами данных, выборка и обработка текста )

for (для) for (инициализация; условие; приращение) действие

for (i = 1; i <= 100; i = i + 2) print i

инициализация задает инициализацию цикла while (условие) проверка перед каждой итерацией { действие

приращение часть итерации }

действие

Page 47: (манипулирование файлами данных, выборка и обработка текста )

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"}

действие

Page 48: (манипулирование файлами данных, выборка и обработка текста )

break (прерывание) – «досрочный» выход из цикла

break

continue (продолжение) – новая итерация - выполнение нового цикла

continue

- для do, while, for

действие

Page 49: (манипулирование файлами данных, выборка и обработка текста )

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

Математические функции

exp() – экспонента

log() - натуральный логарифм

sqrt() - квадратный корень

int() - целая часть числа

действие

Page 50: (манипулирование файлами данных, выборка и обработка текста )

length(arg) - Функция длины arg. length - длина текущей строки

substr(s, m, n) - Возвращает подстроку строки s, начиная с позиции m, всего n символов.

index(s, t) - Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)

Строковые функции действие

Page 51: (манипулирование файлами данных, выборка и обработка текста )

sprintf(fmt,exp1,exp2,...) - форматированная печать (вывод) в строку, идентично PRINTF

split(s, array, sep) - Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.

действие

Page 52: (манипулирование файлами данных, выборка и обработка текста )
Page 53: (манипулирование файлами данных, выборка и обработка текста )