
- •Программирование вывода текста awk
- •Внимание. В awk могут быть проблемы с русской буквой я/Я.
- •Полная командная строка для awk
- •Оператор-шаблон используется для выбора строк из файла,
- •Внимание! Нельзя одновременно опускать и шаблон и действие.
- •Если оператор-шаблон и/или оператор действия задаются в командной строке, то они заключаются в
- •Записи делятся на поля, разделенные
- •В awk не существует оператора read. awk автоматически получает каждую запись.
- •1. Обращение к полям
- •Например, пусть у нас имеется файл с именем cars.file, содержащий:
- •Причем при выводе на экран между наименованием марки и наименованием фирмы будет стоять
- •c) Оператор print “” печатает пустую строку, о оператор print печатает текущую строку
- •Этот символ можно переопределить, используя в качестве разделителя любой одиночный символ.
- •Второй способ переопределения
- •Однако, если в качестве разделителя
- •2. Выполнение команд из входного файла
- •Тогда предыдущий пример можно выполнить так:
- •Итак, выполнение команд из файла необходимо делать в следующей последовательности:
- •Если в одной строке несколько операторов-
- •В операторе print фрагменты, отделяемые запятой, печатаются через символы разделения полей выходного потока,
- •Для полного контроля над выходным потоком используется оператор printf,
- •Если нет выходного потока, то считается, что данные удовлетворяют соответствующему критерию.
- •Причем необходимо помнить, что это разные шаблоны.
- •В шаблонах можно применять метасимволы, как и в функции grep:
- •A. Шаблоны BEGIN и END
- •Некоторые версии awk требуют, чтобы шаблон BEGIN был первым шаблоном программы, а шаблон
- •задает строки от 10-ой до 20-ой
- •Например, в файле file.me находятся строки:
- •Если выражение арифметическое, то
- •C. Использование арифметических
- •-переменную SUM, введенную пользователем;
- •В этих всех примерах использование опции -f эквивалентно набору операторов в командной строке
- •Встроенные переменные awk
- •OFMT - формат вывода чисел ( по умолчанию принят %6g (См. printf ),
- •Операции, выполняемые awk
- •Операции отношения
- •В awk любое выражение можно использовать с любой операцией. Преобразование числа в строку
- •Встроенные функции awk
- •rand()
- •split (S,A,C) - разбиение строки S на массив
- •tolower (Str)- переводит символы строки Str в нижний регистр;
- •sub (Re, SubStr, Str) – замещает в строке
- •match (Str, Re) - возвращает позицию в строке Str, в которой располагается
- •Примеры:
- •2. Пусть в файле file.txt находятся строки:
- •В результате получаем:
- •Массивы
- •Пример.
- •В результате должно быть: John 200,
- •Однако порядок появления индексов неопределен, поэтому может возникнуть необходимость в их сортировке.
- •Такой прием очень удобен, чтобы определить, например, частоту появления
- •Пример вывода на экран: the 102
- •Здесь в первом цикле for выбирается каждое слово из входной строки и заполняется
- •Для удаления некоторого элемента из
match (Str, Re) - возвращает позицию в строке Str, в которой располагается
подстрока, удовлетворяющая регулярному выражению Re. Она возвращает индекс начала подстроки, удовлетворяющей
шаблону, или 0, если подстрока не существует.
Также эта функция определяет значения переменных RSTART и RLENGTH.
52
Примеры:
1. Например, в конвейере echo 9/29/2014 |
awk '{ split ( $0,date,"/"); print date [3]}‘
строка "9/29/98", которая будет помещена в переменную $0, разбивается на массив date из трех элементов:
date[1]=9,
date[2]=29,
date[3]=2014. Причем на экран будет
выведен значение года - 2014. |
53 |
|
2. Пусть в файле file.txt находятся строки:
Toronto |
|
Paris |
|
Edmonton |
|
Программа на awk имеет вид: |
|
awk ‘{save = $0 |
|
printf “15s\t” $0 |
|
gsub(/on/,”ON”,$0) |
|
printf “15s\t” $0 |
|
sub(/on/,”ON”,save) |
|
printf “15s\t” save |
|
}’ file.txt |
54 |
В результате получаем: |
|
|
Toronto |
TorONto |
TorONto |
Paris |
Paris |
Paris |
Edmonton |
EdmONton |
EdmONtON |
55
Массивы
Подобно переменным, массивы не нужно описывать.
Размер массива ограничен только объемом памяти.
В awk индексом массива может быть не только целое число, но и любое значение.
Название переменных и массивов
чувствительно к регистру.
56
Пример.
Пусть необходимо подсчитать суммарное значение для каждого имени игрока.
Anna 400
John 100
Mary 200
Mary 300
John 100
Anna 100
Mary 100
57
В результате должно быть: John 200,
Mary 600,
Anna 500.
Для этого применим программу: awk ‘END {
for (Name in SUM)
{print Name SUM [Name]}} {SUM [$1] += $2}’
58
Здесь каждое имя $1 служит индексом в массиве SUM.
В конце применена специальная форма цикла for для перебора всех элементов SUM и их печати.
Синтаксис этого варианта цикла for таков:
for (Var in Array) Operator
Здесь цикл охватывает индексы массива, а не его элементы, устанавливая значение "Var" равным каждому индексу поочередно.
59
Однако порядок появления индексов неопределен, поэтому может возникнуть необходимость в их сортировке.
Например, в приведенном примере выходной поток можно по конвейеру
передать команде sort, чтобы имена шли в порядке убывания значений:
awk '.....' | sort +1 –nr
(сортировка идет по численному полю, начиная со второго в порядке убывания).
60
Такой прием очень удобен, чтобы определить, например, частоту появления
слов во входном потоке:
cat > wordfreq.file awk 'END {
for (word in Num) print word Num[word]}
{ for ( i=1; ; i++) Num[$i]++}‘ wordfreq.file | sort +1 -nr
61