- •Программирование вывода текста 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 выбирается каждое слово из входной строки и заполняется
- •Для удаления некоторого элемента из
Например, пусть у нас имеется файл с именем cars.file, содержащий:
-в первом поле название фирмы,
-во втором - название марки автомобиля и
-в третьем - его цену.
Тогда применив команду
awk `{print $2 "," $1 "Tab" $3}` cars.file
где "Tab" - знак табуляции (то есть, нажатие на клавишу "Tab").
В этом примере мы сначала выводим на экран марку автомобиля, потом его фирму и
только потом цену. |
11 |
Причем при выводе на экран между наименованием марки и наименованием фирмы будет стоять знак запятой, а между фирмой и ценой - знак табуляции.
ПРИМЕЧАНИЕ!
a)Если в операторе-шаблоне и операторе- действии содержатся специальные символы, то эти символы должны быть заключены в апострофы.
b)Открывающая фигурная скобка "{" оператора-действия должна находиться в той же строке, что и связанный с ней
шаблон. |
12 |
c) Оператор print “” печатает пустую строку, о оператор print печатает текущую строку ввода.
Обычно предполагается, что поля в
записи разделяются специальным символом ( обычно это пробел или табуляция), причем количество
одновременно разделяющих символов может быть произвольным.
13
Этот символ можно переопределить, используя в качестве разделителя любой одиночный символ.
Один из способов состоит в задании в командной строке опции -F.
Тогда, к примеру, для печати первого поля в файле, где разделителями является символ двоеточия (:), можно применить команду:
awk -F: '{print $1}' file.my
14
Второй способ переопределения
разделителя полей - это использование
встроенной переменной FS. Например, FS = ":";
Обработка пробелов и символов табуляции здесь особая. По умолчанию и
пробелы и символы табуляции служат разделителями, а разделители в начале строки отбрасываются.
15
Однако, если в качестве разделителя
определен не пробел, то разделители в начале строки учитываются при определении полей.
В частности, если используется символ табуляции, то пробелы не являются
символами-разделителями и поэтому
пробелы в начале строки входят в поле, и
каждый символ табуляции определяет поле.
16
2. Выполнение команд из входного файла
Чтобы не набирать каждый раз команды,
как только что в приведенном (ранее) примере, можно поместить операторы в отдельный файл, сделать файл выполняемым, а затем активизировать этот файл в командной строке awk с помощью опции -f.
17
Тогда предыдущий пример можно выполнить так:
cat > file.awk |
|
{print $2 "," $1 "Tab" $3} |
CTRL-D |
# Это ввод строки в файл file.awk
причем операторы-действия вводятся без апострофов.
awk -f file.awk cars.file
# Запуск программы file.awk
( для того, чтобы сделать файл выполняемым, надо выполнить команду chmod +x file.awk )
Результат выполнения этого примера будет аналогичен предыдущему.
18
Итак, выполнение команд из файла необходимо делать в следующей последовательности:
Поместить команды в файл.
Придать файлу с командами статус выполняемого.
Активизировать этот файл с опцией -f.
Необходимо помнить, что операторы
действия в файле должны быть без апострофов.
19
Если в одной строке несколько операторов-
действия, то они должны разделяться символами
";".
Если в в каждой строке располагается только один оператор, то символ ";" можно опускать.
3.Печать
Вкоманде awk доступна и другая информация. Встроенная переменная NR хранит номер текущей входной записи, то есть номер текущей строки.
Поэтому для вставки номера строки перед строкой входного потока достаточно задать значение этой переменной:
awk '{print NR, $0}' |
20 |
|
