действие

advertisement
AWK (GAWK) 2
(манипулирование файлами данных,
выборка и обработка текста )
Преподаватель:
Петриков Владимир Дмитриевич
Регулярное выражение
/Иванов/
метасимволы (шаблоны)
^ $ [ ] - + * .(точка) \
^ -- соответствует началу строки
/^A/ - строки, начинающиеся на A
$4 ~ /^Иванов/
$ -- соответствует концу строки.
/A$/ отвечает строкам, заканчивающимся на A.
$4 ~ /вна$/
"^$"
соответствует пустой строке.
шаблон
шаблон
[ ] -- множество единичных символов
[AWK] соответствует множеству из трех букв A, W, K
G[AWK] представляет множество строк { GA, GW, GK }
- -- задаёт диапазон символов
[a-z] соответствует символам от a до z, {a b c d … y z}
$4 ~ /^[А-С]/
не POSIX – нет переносимости (в Gawk-е не работает)
+ -- предыдущий символ присутствует в образце
многократно ( не менее одного раза)
шаблон
[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 раз
[1-9][0-9]* -- положительные целые числа до 99
{1 2 … 10 …99}
шаблон
.(точка) -- произвольный единичный символ
.* - обозначает произвольную
"13." \
комбинацию символов.
131 133 134 13_ 13\n 13
-- отменяет специальное значение
последующего символа.
\$ - это символ $
\/ - это символ /
Управляющие последовательности
для символов ASCII с кодами 0 - 31
\a
\b
\f
0x07 BEL Звуковой сигнал
0x08 BS Забой
0x0C FF Перевод бланка
\n
0x0A LF
\r
0x0D CR
Новая строка (перевод строки) (new line)
Line Feed
Возврат каретки
Caridge Return
\t
\v
0x09 HT
0x0B VT
Табуляция (горизонтальная)
Вертикальная табуляция
Bell
Back Space
Form Feed
Символы, используемые в разных «шаблонах»
printf("Hello Word !!! \n");
\\
\/
\'
\"
\?
0x5c
\
/
0x27 '
0x22 "
0x3F ?
как напечатать \ “ ?
Обратная наклонная черта
Прямая наклонная черта
Одинарная кавычка (апостроф)
Двойная кавычка
Вопросительный знак
Универсальный способ
\ddd
\xdd
строка до трех восьмеричных цифр (0 - 377)
строка шестнадцатеричных цифр (0 - FF)
Выражение
Действие
\с
^
$
.
Символ "с"
Начало строки
Конец строки
Любой символ
[s]
[^s]
r*
Любой символ из набора "s"
Любой символ, не входящий в набор "s"
Ноль или больше
r+
r?
(r)
r1|r2
Один или больше
Ноль или один
r , группировка, при конкатенации строк
r1 или r2
Классы символов POSIX
- для разных стран!
• [:alnum:] -- алфавитные символы и цифры = [A-Za-z0-9] для USA
• [:alpha:] -- символы алфавита = [A-Za-z]
• [:blank:] -- символы пробела и табуляции
• [:cntrl:] -- управляющие символы (control characters).
• [:punct:] -- символы пунктуации
• [:digit:] -- символы десятичных цифр = [0-9]
• [:xdigit:] -- символы шестнадцатиричных цифр = [0-9A-Fa-f]
• [:graph:]
• [:print:]
(печатаемые и псевдографические (видимые) символы) –
без пробела.
(печатаемые символы) + символ пробела
• [:space:] -- пробельные символы (такие как пробел и TAB, FF)
• [:lower:] -- алфавитные символы в нижнем регистре = [a-z]
• [:upper:] -- символы алфавита в верхнем регистре = [A-Z]
символьные классы POSIX ------ / [ класс ] /
в двойные квадратные скобки / [[:alnum:]] /
Область шаблона
pat1
, pat2
{...}
/Canada/ , /Brazil/
от
China 3692 866 Asia
Canada 3852 24 North America
до
USA 3615 219 North America
Brazil 3286 116 South America
BEGIN и END
выполняется
1 раз
BEGIN
Программа
выполняется
1 раз
END
BEGIN { printf “СТАРТ\n” }
/Иванов/
END { printf “\nФИНИШ”}'
выполняется
много раз
Входной
файл
BEGIN { printf "СТАРТ\n\n"}
/Иванов/ {n = n+1}
подсчет строк с /Иванов/
END { printf " %d \n", n
printf "\n\nФИНИШ"}
BEGIN
{
printf "СТАРТ\n\n”
}
WIN
BEGIN {
printf "СТАРТ\n\n”
}
Действие
предложения, разделенные ;
или \n (новая строка)
Вывод (Печать)
Присваивание
n=1
Управляющая структура
Встроенная функция
действие
Вывод (Печать)
print
print
-
выводится вся запись + \n
print $0
$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
Типы переменных и их преобразование
Переменные - числа с плавающей запятой
строки
или и то, и другое одновременно
a = 12
b = a ""
print a, b
print a + b
b= a "stroka"
print a, b
print a + b
Тип переменной зависит от контекста.
В числовых выражениях переменная - число,
в строковых
- строка.
12 12
24
12 12stroka
24
b= "stroka"a # b=0
print a, b
12 stroka12
print a + b
12
целые значения всегда
преобразуются как целые
По умолчанию
число = 0
строка = "" (пустая строка
pr6.bat
Операции
=
простое присваивание
x=y=z=5
(переменная = значение)
как в Си
арифметические
+ сложение
- вычитание
* умножение
/
деление - для вещественных чисел
% модуль (остаток при целочисленном делении)
^ возведение в степень ( ** )
-x
+x
унарный минус, отрицание
унарный плюс; выражение преобразуется в число
++ инкремент n++ - n = n+1
-- декремент n-- - n = n-1
могут быть префиксными и постфиксными
сложные виды присваивания
(операция и присваивание)
+=
-=
*=
/=
%=
^=
увеличить на
возведение в степень и присваивание
Условная Операция
условие ? if-true-exp1 : if-false-exp2
if(условие)
exp1
else
x >= 0 ? x : -x
exp2
берём положительное значение x
Побочные эффекты
b=6
print b += b++
или
b=6
b += ++b + b++
print b
не надо так писать!!!
Встроенные арифметические функции
Функция
Возвращаемое значение
exp(x)
log(x)
Экспоненциальная функция x
sqrt(x)
int(x)
sin(x)
Квадрат x
cos(x)
atan2(y,x)
rand()
srand(x)
Косинус x
Натуральный логарифм x
Целая часть x с усеченными лидирующими нулями
Синус x
Арктангенс y/x в пределах от "-пи" до "пи"
псевдо - Случайное число между 0 и 1
[0 1)
x - новое начальное значение для послед. rand( )
Если srand() не имеет аргументов, то начальное
значение производится из времени дня.
Встроенные строковые функции awk
Функция
Описание
length( [ s ] )
Возвращает длину s
sprintf( fmt, expr-list )
Возвращает expr-list, отформатированный в
соответствии с форматом строки fmt
(без печати)
index( s, t )
Возвращает позицию подстроки t в s:
0 - если t нет в s
split( s, a )
Разделяет s на массив a по FS; a[1], a[2], …
возвращает число полей
split( s, a, razdelit )
Разделяет s на массив a по razdelit;
возвращает число полей
( или $0 )
Строковые функции
length(arg) - Функция длины arg.
length- длина текущей строки
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, то при анализе строки он
понимается как разделитель.
Встроенные строковые функции awk
Функция
Описание
sub(regexp,
Замещает первое regexp в текущей записи на
replacement_str, возвращает количество замен
replacement_str)
sub( reg , s , t )
Заменяет первое reg на s в строке t,
возвращает количество замен
substr( s , p )
Возвращает подстроку s, начиная с позиции p
substr( s , p , n )
Возвращает подстроку s, начиная с позиции p
длиной n
gsub( reg , s )
Глобальная замена reg на s в текущей записи;
возвращает количество замененных символов
gsub(reg , s , t )
Глобальная замена reg на s в строке t,
возвращает количество замененных символов
gensub( reg, s,
how [, target ] )
s – не меняется! Возвращается копия $0 [target]
с заменами, how должно быть - “g” | | “G” | |
номер совпадения с reg, для замены
Встроенные строковые функции awk
Функция
Описание
match(string,
regexp)
Возвращает индекс string, где встречается
regexp; 0 - если regexp не встретилось
strtonum(string)
возврат числового значения (dec, oct, hex)
( ~ 0 + str для dec)
tolower(string)
возвращает string,
преобразованную в нижний регистр
toupper(string)
возвращает string,
преобразованную в верхний регистр
Встроенные строковые функции awk
asort(source [, dest])
a["last"]
= "de"
a["first"]
= "sac"
a["middle"] = "cul"
- сортировка
asort(a)
a[1] = "cul"
a[2] = "de"
a[3] = "sac"
a["last"]
= "de"
a["first"]
= "sac"
a["middle"] = "cul"
n = asort( a , b )
b[1] = "cul"
b[2] = "de"
b[3] = "sac"
Download