awkposix - онлайн в облаке

Это команда awkposix, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


awk - язык сканирования и обработки паттернов

СИНТАКСИС


AWK [−F разделительная строка] [-v назначение]... программа [аргумент...]

AWK [−F разделительная строка] -f прогфайл [-f прогфайл]... [-v назначение]...
[аргумент...]

ОПИСАНИЕ


The AWK утилита должна выполнять программы, написанные на AWK язык программирования, который
специализирован для обработки текстовых данных. An AWK программа представляет собой последовательность шаблонов и
соответствующие действия. Когда считывается ввод, соответствующий шаблону, действие, связанное с
с этим узором выполняется.

Входные данные следует интерпретировать как последовательность записей. По умолчанию запись представляет собой строку, меньше
его прекращение , но это можно изменить, используя RS встроенная переменная. Каждый
запись ввода должна быть сопоставлена ​​по очереди с каждым шаблоном в программе. Для каждого
шаблон совпадает, соответствующее действие должно быть выполнено.

The AWK утилита должна интерпретировать каждую входную запись как последовательность полей, где
по умолчанию поле представляет собой строку не- не- символы. Это значение по умолчанию
и разделитель полей можно изменить с помощью FS встроенная переменная или −F
разделительная строка вариант. AWK Утилита должна обозначать первое поле в записи $ 1, второе
2 доллара и так далее. Символ $ 0 относится ко всей записи; установка любого другого поля
вызывает переоценку 0 долларов. Назначение $ 0 приведет к сбросу значений всех других полей.
и NF встроенная переменная.

ДОПОЛНИТЕЛЬНЫЕ ОПЦИИ


The AWK утилита должна соответствовать тому Базовые определения POSIX.1-2008, Раздел
12.2, утилита Синтаксис Инструкции.

Поддерживаются следующие варианты:

−F разделительная строка
Определите разделитель полей ввода. Этот вариант должен быть эквивалентен:

-v FS =разделительная строка

за исключением того, что если −F разделительная строка и -v FS =разделительная строка оба используются, это не указано
ли FS назначение в результате −F разделительная строка обрабатывается в команде
строчный заказ или обрабатывается после последнего -v FS =разделительная строка. Смотрите описание
FS встроенная переменная, и как она используется, в РАСШИРЕННОМ ОПИСАНИИ
.

-f прогфайл
Укажите путь к файлу прогфайл содержащий AWK программа. Путь
of '-' будет обозначать стандартный ввод. Если несколько экземпляров этой опции
указано, конкатенация файлов, указанных как прогфайл в порядке
указывается AWK программа. AWK программа может быть альтернативно
указывается в командной строке как единственный аргумент.

-v назначение
Приложение должно гарантировать, что назначение аргумент в той же форме, что и
an назначение операнд. Указанное присвоение переменной должно произойти до
выполнение AWK программа, включая действия, связанные с НАЧАТЬ паттеранами
(если есть). Можно указать несколько экземпляров этой опции.

ОПЕРАНДЫ


Поддерживаются следующие операнды:

программа Если нет -f указана опция, первый операнд для AWK должен быть текст
AWK программа. В заявлении должны быть указаны программа операнд как единый
аргумент AWK. Если текст не заканчивается на , AWK интерпретирует
текст, как будто это сделал.

аргумент Любой из следующих двух типов аргумент можно смешивать:

файл Путь к файлу, который содержит ввод для чтения, т.е.
сопоставлен с набором шаблонов в программе. Если нет файл
указаны операнды, или если файл операнд '-', Стандарт
ввод должен использоваться.

назначение
Операнд, начинающийся с или буквенный символ
из переносимого набора символов (см. таблицу в Базовых определениях)
том POSIX.1‐2008, Раздел 6.1, Портативная Характер Поставьте), последовал
последовательностью знаков подчеркивания, цифр и букв из
переносимый набор символов, за которым следует знак равно характер, должен указывать
присвоение переменной, а не путь. Персонажи до
знак равно представляют имя AWK Переменная; если это имя AWK
зарезервированное слово (см. Grammar) поведение не определено. Персонажи
после интерпретируются так, как если бы они возникли
в AWK программа, перед которой и после нее следует двойная кавычка ('"')
персонаж, как STRING жетон (см. Grammar), за исключением того, что если последний
персонаж - неэкранированный , это следует толковать как
буквальный а не как первый символ последовательности
"\" ". Переменной должно быть присвоено значение этого STRING знак
и, при необходимости, считается числовой string (См.
Expressions in AWK) переменной также должно быть присвоено ее числовое значение.
ценность. Каждое такое присвоение переменной должно происходить непосредственно перед
обработка следующих файл, если есть. Таким образом, задание перед
первый файл аргумент должен выполняться после НАЧАТЬ действия (если
любой), а присваивание после последнего файл аргумент должен произойти
до END действия (если есть). Если нет файл аргументы,
присвоения должны выполняться до обработки стандартного ввода.

СТАНДИН


Стандартный ввод должен использоваться, только если нет файл указаны операнды, или если файл
операнд '-', или если прогфайл параметр-аргумент '-'; см. раздел ВХОДНЫЕ ФАЙЛЫ. Если
AWK программа не содержит действий и шаблонов, но в остальном является допустимым AWK программа,
стандартный ввод и любые файл операнды не должны читаться и AWK выйдет с возвратом
статус нулевой.

ВХОД FILES


Входные файлы в AWK программа из любого из следующих источников должна быть текстовыми файлами:

* Любой файл операнды или их эквиваленты, достигаемые путем изменения AWK переменные АРГВ
и АРГК

* Стандартный ввод при отсутствии каких-либо файл операнды

* Аргументы в пользу Getline функция

Была ли переменная RS установлен на значение, отличное от или нет, для этих файлов
реализации должны поддерживать записи, заканчивающиеся указанным разделителем, до
{LINE_MAX} байт и может поддерживать более длинные записи.

If -f прогфайл указано, приложение должно гарантировать, что файлы, названные каждым из
прогфайл аргументы-опции - это текстовые файлы и их объединение в том же порядке, что и
они появляются в аргументах, это AWK программу.

ОКРУЖАЮЩАЯ СРЕДА ПЕРЕМЕННЫЕ


Следующие переменные среды должны влиять на выполнение AWK:

ДЛИННЫЙ Задайте значение по умолчанию для переменных интернационализации, которые не установлены или
нулевой. (См. Том Базовых определений POSIX.1-2008, Раздел 8.2,
Интернационализация Переменные показатели за приоритет интернационализации
переменные, используемые для определения значений категорий локали.)

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

LC_COLLATE
Определите локаль для поведения диапазонов, классов эквивалентности и мульти-
элементы сопоставления символов в регулярных выражениях и при сравнении
строковые значения.

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

LC_MESSAGES
Определите языковой стандарт, который следует использовать, чтобы повлиять на формат и содержимое
диагностические сообщения записываются в стандартную ошибку.

LC_NUMERIC
Определите символ системы счисления, используемый при интерпретации числового ввода, выполняя
преобразование числовых и строковых значений и форматирование числового вывода.
Независимо от региона символ (десятичный знак символа
POSIX locale) - десятичный знак, распознаваемый при обработке. AWK
программы (включая присваивания в аргументах командной строки).

НЛПСАТ Определите расположение каталогов сообщений для обработки LC_MESSAGES.

PATH Определите путь поиска при поиске команд, выполняемых система(выраж), или
входные и выходные трубы; см. том Базовых определений POSIX.1-2008, Глава
8, Окружающая среда Переменные показатели.

Кроме того, все переменные среды должны быть видны через AWK переменная ОКРУЖАЮЩАЯ СРЕДА.

АСИНХРОННЫЙ СОБЫТИЯ


По умолчанию.

стандартный вывод


Характер выходных файлов зависит от AWK программу.

СТДЕРР


Стандартная ошибка должна использоваться только для диагностических сообщений.

ВЫВОД FILES


Характер выходных файлов зависит от AWK программу.

РАСПРОСТРАНЕНИЯ ОПИСАНИЕ


В общем Программа Структура:
An AWK программа состоит из пар вида:

описания { действие }

Либо шаблон, либо действие (включая символы заключающих скобок) могут быть
опущено.

Отсутствующий шаблон должен соответствовать любой записи ввода, а отсутствующее действие должно быть
эквивалентно:

{ Распечатать }

Исполнение AWK программа должна начинаться с выполнения действий, связанных с
ВСЕ НАЧАТЬ шаблоны в том порядке, в котором они встречаются в программе. Тогда каждый файл операнд (или
стандартный ввод, если файлы не были указаны) должны обрабатываться по очереди путем чтения данных из
файл до тех пор, пока не будет виден разделитель записей ( по умолчанию). Перед первым
ссылка на поле в записи оценивается, запись разбивается на поля,
согласно правилам в Стандарт Expressions, используя значение FS это было актуально в
время чтения записи. Затем каждый шаблон в программе должен быть оценен в
порядок появления и действие, связанное с каждым шаблоном, который соответствует текущему
запись выполнена. Действие для совпадающего шаблона должно быть выполнено до оценки
последующие узоры. Наконец, действия, связанные со всеми END шаблоны должны быть
выполняются в том порядке, в котором они встречаются в программе.

Expressions in AWK
Выражения описывают вычисления, используемые в паттеранами и действия. В следующей таблице
допустимые операции выражения даны в группах от первого до самого низкого приоритета
последний приоритет с операторами равного приоритета, сгруппированными между горизонтальными линиями. В
оценка выражения, где грамматика формально неоднозначна, более высокий приоритет
операторы должны оцениваться перед операторами с более низким приоритетом. В этой таблице выраж, выражение1,
выражение2 и выражение3 представляют любое выражение, а lvalue представляет любую сущность, которая может быть
присвоено (то есть слева от оператора присваивания). Точный синтаксис
выражения даны в Grammar.

Таблица 4-1: Expressions in Убывающий старшинство in AWK

┌──────────────────────┬──────────────────────────── ───────────────┬───────────────
СинтаксисИмяТип of РезультатАссоциативность
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│ ( выраж ) │Группировка │Тип выраж │N / A │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│$выраж │Ссылка на поле │String │N / A │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│lvalue ++ │Постинкремент │Числовой │N / A │
│lvalue −− │Пост-декремент │Числовой │N / A │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│ ++ lvalue │Предварительное приращение │Числовое │N / A │
│−− lvalue │Предекремент │Числовой │N / A │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж ^ выраж │ Возведение в степень │ Числовое │ Право │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│! выраж │Логический, а не Числовой │N / A │
│+ выраж │Унарный плюс │Цифровой │N / A │
│− выраж │Унарный минус │Цифровой │N / A │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж * выраж │Множение │Цифровое │Влево │
выраж / выраж │Раздел │Числовой │Левый │
выраж % выраж │Модуль │Числовой │Левой │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж + выраж │Добавление │Цифровое │Влево │
выраж - выраж │ Вычитание │ Числовое │ Влево │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж выраж │Соединение строк │String │Left │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж < выраж │Меньше │Числовой │Нет
выраж <= выраж │Меньше или равно │Числовой │Нет │
выраж != выраж │Не равно │Numeric │None │
выраж == выраж │Равно │Числовой │Нет
выраж > выраж │Больше, чем │Цифровой │Нет
выраж >= выраж │Больше или равно │Числовой │Нет │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж ~ выраж │ERE соответствует │Numeric │None │
выраж !~ выраж │ERE несоответствие │Числовой │Нет │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж в массиве │ Членство в массиве │ Числовое │ Влево │
│ ( индекс ) в массив │Многомерный массив │Числовой │Влево │
│ │членство │ │ │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж && выраж │Логический И │Числовой │Влево │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выраж || выраж │Логическое ИЛИ │Цифровое │Влево │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
выражение1 ? выражение2 : выражение3│Условное выражение │Тип выбранного│Права │
│ │ │выражение2 or выражение3 │ │
├──────────────────────┼──────────────────────────── ───────────────┼───────────────
│lvalue ^ = выраж │ Присвоение степени Числовое │ Право │
│lvalue% = выраж │Назначение модуля │Цифровое │Права │
│lvalue * = выраж │Присваивание умножения│Цифровое │Права │
│lvalue / = выраж │Назначение подразделения │Цифровое │Права │
│lvalue + = выраж │Добавление │Цифровое │Права
│lvalue - = выраж │Присваивание вычитания │Цифра │Права │
│lзначение = выраж │Назначение │Тип выраж │Вправо
└──────────────────────┴─────────────────────────── ───────────────┴───────────────┘
Каждое выражение должно иметь строковое значение, числовое значение или и то, и другое. За исключением
указано для конкретных контекстов, значение выражения должно быть неявно преобразовано в
тип, необходимый для контекста, в котором он используется. Строковое значение должно быть преобразовано в
числовое значение либо эквивалентом следующих вызовов функций, определенных
стандарт ISO C:

setlocale (LC_NUMERIC, "");
числовое значение = atof (строковое значение);

или преобразовав начальную часть строки в тип двойной представление как
следующим образом:

Входная строка разбивается на две части: начальная, возможно, пустая последовательность
символов пробела (как указано isspace()) и сюжетная последовательность
интерпретируется как константа с плавающей запятой.

Ожидаемая форма тематической последовательности является необязательной. '+' or '-' знак, затем
непустая последовательность цифр, необязательно содержащая , затем необязательный
показательная часть. Показательная часть состоит из «Е» or 'E', за которым следует необязательный
знак, за которым следует одна или несколько десятичных цифр.

Последовательность, начинающаяся с первой цифры или (в зависимости от того, что наступит раньше)
интерпретируется как плавающая константа языка C, и если ни одна из экспонент
часть ни появляется предполагается, что следует за последней цифрой в
нить. Если предметная последовательность начинается со знака минус, значение, полученное в результате
преобразование отменяется.

Числовое значение, которое точно равно значению целого числа (см. Раздел 1.1.2,
концепции Производный от ISO C Стандарт) должен быть преобразован в строку эквивалентным
звонка в Sprintf функция (см. строка функции) со строкой "% d" как FMT
аргумент и числовое значение, преобразуемое как первое и единственное выраж аргумент. Любой
другое числовое значение должно быть преобразовано в строку эквивалентом вызова
Sprintf функция со значением переменной КОНВФМТ как FMT аргумент и
числовое значение преобразуется как первое и единственное выраж аргумент. Результат
преобразование не указано, если значение КОНВФМТ не является форматом с плавающей запятой
Спецификация. Этот том POSIX.1-2008 не определяет явных преобразований между
числа и строки. Приложение может заставить выражение трактоваться как число с помощью
добавляя к нему ноль, или можно заставить его обрабатывать как строку, объединив нуль
нить ("") к нему.

Строковое значение считается числовой string если это происходит из-за одного из следующих:

1. Полевые переменные

2. Вклад Getline() функция

3. ИМЯ ФАЙЛА

4. АРГВ элементы массива

5. ОКРУЖАЮЩАЯ СРЕДА элементы массива

6. Элементы массива, созданные раскол() функция

7. Назначение переменной командной строки.

8. Назначение переменной из другой числовой строковой переменной.

и условие, зависящее от реализации, соответствующее любому из приведенных ниже случаев (а) или (b),
встретились.

а. После эквивалента следующих вызовов функций, определенных ISO C
стандарт, string_value_end будет отличаться от строковое значение, и любые символы до
завершающий нулевой символ в string_value_end было бы символы:

колесница * string_value_end;
setlocale (LC_NUMERIC, "");
числовое значение = стртод (строковое значение, & string_value_end);

б. После применения всех следующих преобразований результирующая строка будет
лексически быть признанным НОМЕР токен, как описано в лексических соглашениях в
Grammar:

- Все ведущие и конечные символы отбрасываются.

- Если первый не- является '+' or '-', он отбрасывается.

- Каждое вхождение символа десятичной точки из текущего языкового стандарта изменяется.
к .
В случае (а) числовое значение числовой string будет значением, которое будет
вернулся стртод() вызов. В случае (б), если первый не- является '-', числовой
значение числовой string является отрицанием числового значения признанного
НОМЕР токен; в противном случае числовое значение числовой string должен быть числовым
ценность признанных НОМЕР токен. Независимо от того, является ли строка числовой string должен быть
актуально только в тех контекстах, где этот термин используется в этом разделе.

Когда выражение используется в логическом контексте, если оно имеет числовое значение, значение
ноль должен рассматриваться как ложный, а любое другое значение должно рассматриваться как истинное. В противном случае
строковое значение пустой строки должно рассматриваться как ложное, а любое другое значение должно быть
рассматривается как правда. Логический контекст должен быть одним из следующих:

* Первое подвыражение условного выражения

* Выражение, оперируемое логическим НЕ, логическим И или логическим ИЛИ

* Второе выражение для заявление

* Выражение if заявление

* Выражение в то время как пункт в в то время как or do...в то время как заявление

* Выражение, используемое в качестве шаблона (как в общей структуре программы)

Вся арифметика должна следовать семантике арифметики с плавающей запятой, как указано в
Стандарт ISO C (см. Раздел 1.1.2, концепции Производный от ISO C Стандарт).

Значение выражения:

выражение1 ^ выражение2

должен быть эквивалентен значению, возвращаемому вызовом стандартной функции ISO C:

пау (выражение1, выражение2)

Выражение:

именующий ^= выраж

должен быть эквивалентен стандартному выражению ISO C:

именующий = pow (lvalue, выраж)

за исключением того, что lvalue оценивается только один раз. Значение выражения:

выражение1 % выражение2

должен быть эквивалентен значению, возвращаемому вызовом стандартной функции ISO C:

fmod (выражение1, выражение2)

Выражение:

именующий %= выраж

должен быть эквивалентен стандартному выражению ISO C:

именующий = fmod (lvalue, выраж)

за исключением того, что lvalue оценивается только один раз.

Переменные и поля должны быть установлены оператором присваивания:

именующий = выражение

и тип выражение должен определять тип результирующей переменной. Назначение
включает арифметические задания ("+ =", "- =", знак равно, знак равно, знак равно, "^ =", "++", "---") все
из которых должен давать числовой результат. Левая часть задания и
цель операторов инкремента и декремента может быть одной из переменной, массива с индексом,
или селектор полей.

The AWK язык предоставляет массивы, которые используются для хранения чисел или строк. Массивы
не нужно объявлять. Изначально они должны быть пустыми, а их размеры должны измениться.
динамически. Индексы или идентификаторы элементов - это строки, обеспечивающие тип
возможность ассоциативного массива. Имя массива, за которым следует нижний индекс в квадратных скобках
может использоваться как lvalue и, следовательно, как выражение, как описано в грамматике; видеть
Grammar. Имена массивов без индексов могут использоваться только в следующих контекстах:

* Параметр в определении функции или вызове функции

* ИМЯ токен после любого использования ключевого слова in как указано в грамматике (см.
Grammar); если имя, используемое в этом контексте, не является именем массива, поведение
не определено

Действительный массив индекс состоит из одного или нескольких -разделенные выражения, аналогичные
способ индексации многомерных массивов в некоторых языках программирования.
Так как AWK массивы действительно одномерные, например -отделенный список должен быть
преобразованы в одну строку путем объединения строковых значений отдельных
выражения, каждое из которых отделено друг от друга значением ПОДПИСЬ Переменная. Таким образом
следующие две операции с индексами должны быть эквивалентными:

вар[выражение1, выражение2... выражение]

вар[выражение1 ПОДПИСЬ выражение2 ПОДПИСЬ ... ПОДПОДПИСЬ выражение]

Приложение должно гарантировать, что многомерный индекс используется с in оператор
в скобках. В in оператор, который проверяет наличие определенного массива
элемент, не должен вызывать существование этого элемента. Любая другая ссылка на несуществующий массив
элемент автоматически создаст его.

Сравнения (с '<', "<=", знак равно, "==", '>' и "> =" операторы) должны быть выполнены
численно, если оба операнда числовые, если один числовой, а другой - строковый
значение, которое является числовой строкой, или если одна числовая, а другая неинициализированная
ценность. В противном случае операнды должны быть преобразованы в строки по мере необходимости, а строка
сравнение должно производиться с использованием последовательности сопоставления, зависящей от локали. Ценность
Выражение сравнения должно быть 1, если отношение истинно, или 0, если отношение ложно.

Переменные показатели и Особый - Special Переменные показатели
Переменные можно использовать в AWK программа, ссылаясь на них. За исключением
параметры функции (см. Определяемые пользователем функции), они явно не декларируются.
Имена параметров функции должны быть локальными для функции; все другие имена переменных должны быть
Глобальный. Одно и то же имя не может использоваться как имя параметра функции и как имя.
функции или специального AWK Переменная. Одно и то же имя не может использоваться одновременно как
имя переменной с глобальной областью видимости и как имя функции. То же имя не может быть
используется в той же области как скалярная переменная и как массив. Неинициализированный
переменные, включая скалярные переменные, элементы массива и переменные поля, должны иметь
неинициализированное значение. Неинициализированное значение должно иметь как числовое значение, равное нулю, так и
строковое значение пустой строки. Оценка переменных с неинициализированным значением, чтобы
строковые или числовые, должны определяться контекстом, в котором они используются.

Переменные поля обозначаются значком '$' за которым следует число или числовое выражение.
Влияние номера поля выражение оценка чего-либо кроме неотрицательного
целое число не указано; неинициализированные переменные или строковые значения не нужно преобразовывать в
числовые значения в этом контексте. Новые переменные поля могут быть созданы путем присвоения значения
их. Ссылки на несуществующие поля (то есть поля после $NF), должен оценивать
неинициализированное значение. Такие ссылки не должны создавать новые поля. Однако присвоение
несуществующее поле (например, $ (NF+2) = 5) увеличивает значение NF; создавать любые
промежуточные поля с неинициализированным значением; и заставит значение $ 0 быть
пересчитывается, при этом поля разделяются значением ОФС. Каждая переменная поля
при создании должен иметь строковое значение или неинициализированное значение. Переменные поля должны
иметь неинициализированное значение при создании из $ 0 с использованием FS и переменная не
содержать любые символы. При необходимости переменная поля должна считаться числовой.
строка (см. Expressions in AWK).

Реализации должны поддерживать следующие другие специальные переменные, которые устанавливаются AWK:

АРГК Количество элементов в АРГВ массив.

АРГВ Массив аргументов командной строки, исключая параметры и программа аргумент,
пронумерованы от нуля до АРГК-1.

Аргументы в АРГВ могут быть изменены или добавлены; АРГК можно изменить. Поскольку каждый
входной файл заканчивается, AWK обрабатывает следующий ненулевой элемент АРГВ, вверх к
текущая стоимость АРГК−1 включительно в качестве имени следующего входного файла. Таким образом,
установка элемента АРГВ обнулить означает, что он не должен рассматриваться как
входной файл. Название '-' обозначает стандартный ввод. Если аргумент совпадает
формат назначение операнд, этот аргумент должен рассматриваться как
назначение А не файл аргумент.

КОНВФМТ The Printf формат для преобразования чисел в строки (кроме вывода
заявления, где ОФМТ используется); "% .6g" по умолчанию.

ОКРУЖАЮЩАЯ СРЕДА Массив, представляющий значение среды, как описано в Exec
функции, определенные в томе Системные интерфейсы POSIX.1-2008. Индексы
массива должны быть строками, состоящими из названий окружения
переменных, а значение каждого элемента массива должно быть строкой, состоящей из
значение этой переменной. Если необходимо, переменная среды должна быть
считается числовой string (См. Expressions in AWK); элемент массива должен
также имеют числовое значение.

Во всех случаях, когда поведение AWK зависит от переменных среды
(включая среду любых команд, AWK выполняется через система
функцию или через перенаправления конвейера с Распечатать заявление, Printf
заявление, или Getline функция), используемая среда должна быть
окружающая среда в то время AWK начал выполнение; это определяется реализацией
есть ли какие-либо модификации ОКРУЖАЮЩАЯ СРЕДА влияет на эту среду.

ИМЯ ФАЙЛА Путь к текущему входному файлу. Внутри НАЧАТЬ действие значение
неопределенный. Внутри END действие значение должно быть именем последнего ввода
файл обработан.

FNR Порядковый номер текущей записи в текущем файле. Внутри НАЧАТЬ
действие значение должно быть нулевым. Внутри END действие значение должно быть
номер последней обработанной записи в последнем обработанном файле.

FS Регулярное выражение разделителя полей ввода; а по умолчанию.

NF Количество полей в текущей записи. Внутри НАЧАТЬ действие, использование NF
не определено, если Getline функционировать без вар аргумент выполнен
ранее. Внутри END действие, NF сохранит ценность, которую он имел на последний
запись прочитана, если последующая, перенаправленная, Getline функционировать без вар
аргумент выполняется до ввода END действия.

NR Порядковый номер текущей записи с начала ввода. Внутри
НАЧАТЬ действие значение должно быть нулевым. Внутри END действие значение должно быть
номер последней обработанной записи.

ОФМТ The Printf формат для преобразования чисел в строки в операторах вывода (см.
Результат Отчеты); "% .6g" по умолчанию. Результат преобразования:
не указано, если значение ОФМТ не является спецификацией формата с плавающей запятой.

ОФС The Распечатать разделитель полей вывода выписки; по умолчанию.

ORS The Распечатать разделитель записи вывода оператора; а по умолчанию.

ДЛИНА Длина строки соответствует совпадение функции.

RS Первый символ строкового значения RS должна быть входной записью
разделитель; а по умолчанию. Если RS содержит более одного символа,
результаты не указаны. Если RS имеет значение null, тогда записи разделяются последовательностями
состоящий из плюс одна или несколько пустых строк в начале или в конце
пустые строки не должны приводить к пустым записям в начале или в конце
ввод, а всегда должен быть разделителем полей, независимо от того, какой
Значение FS есть.

RСТАРТ Начальная позиция строки соответствует совпадение функция, нумерация
от 1. Это всегда должно быть эквивалентно возвращаемому значению совпадение
функции.

ПОДПИСЬ Строка разделителя нижнего индекса для многомерных массивов; значение по умолчанию
определяется реализацией.

Стандарт Expressions
The AWK утилита должна использовать расширенную нотацию регулярных выражений (см. Базовый
Том определений POSIX.1-2008, Раздел 9.4, Расширенный пакет Стандарт Expressions) Кроме этого
он должен позволять использовать соглашения языка C для экранирования специальных символов внутри
ERE, как указано в таблице в томе Базовых определений POSIX.1-2008,
Глава 5, Файл Формат Отзывы ('\\', '\ а', '\ b', '\ f', '\ n', '\р', «\ Т», '\ v') и
следующая таблица; эти escape-последовательности должны распознаваться как внутри, так и снаружи
выражения в скобках. Обратите внимание, что записи не обязательно разделять персонажи и
строковые константы могут содержать персонажей, так что даже "\ п" последовательность действительна в
AWK ERE. Используя символ внутри ERE требует экранирования, показанного в
следующая таблица.

Таблица 4-2: Побег Последовательности in AWK

┌───────────────────────────────────────────────── ────────────────────────────────────
Побег │ │ │
ПоследовательностьОписаниеСмысл
├───────────────────────────────────────────────┼── ────────────────────────────────────
│ \ "│ │ персонаж │
├───────────────────────────────────────────────┼── ────────────────────────────────────
│ \ / │ │ персонаж │
├───────────────────────────────────────────────┼── ────────────────────────────────────
│ \ ddd │ А за символом │ Символ с кодировкой │
│ │ самой длинной последовательностью из одного, │ представлен одним, двумя или │
│ двух- или трехзначное восьмеричное │ трехзначное восьмеричное целое число. Мульти- │
│ │ символов (01234567). Если для всех │ байтовых символов требуется несколько, │
│ │ цифры равны 0 (то есть │ конкатенированные управляющие последовательности │
│ │ представление NUL │ этого типа, включая ведущее │
│ │ символ), поведение для каждого байта. │
│ │ не определено. │ │
├───────────────────────────────────────────────┼── ────────────────────────────────────
│ \ c │ A за персонажем последовал │ Undefined │
│ │ любым персонажем, не описанным в │ │
│ │ в этой таблице или в таблице в │ │
│ │ Объем базовых определений │ │
│ │ POSIX.1-2008, Глава 5, Файл │ │
│ │ Формат Отзывы ('\\', '\ а', '\ b', │ │
│ │ '\ f', '\ n', '\р', «\ Т», '\ v'). │ │
└───────────────────────────────────────────────┴── ────────────────────────────────────
Регулярное выражение можно сопоставить с определенным полем или строкой с помощью одного из
два оператора сопоставления регулярных выражений, '~' и "! ~". Эти операторы должны интерпретировать
их правый операнд как регулярное выражение, а их левый операнд как строка.
Если регулярное выражение соответствует строке, '~' выражение должно оцениваться как значение
1 года, и "! ~" выражение должно иметь значение 0. (Регулярное выражение
операция сопоставления определяется термином, сопоставленным в томе Базовых определений
POSIX.1-2008, Раздел 9.1, Стандарт Выражение Определения, где совпадение происходит на любом
часть строки, если регулярное выражение не ограничено или
специальные символы.) Если регулярное выражение не соответствует строке,
'~' выражение должно оцениваться как значение 0, а "! ~" выражение должно оценивать
до значения 1. Если правый операнд - любое выражение, кроме лексической лексемы
ERE, строковое значение выражения следует интерпретировать как расширенное регулярное
выражение, включая условные обозначения escape, описанные выше. Обратите внимание, что эти же побеги
соглашения также должны применяться при определении значения строкового литерала (
лексический знак STRING), и поэтому должен применяться второй раз, когда строковый литерал
используется в этом контексте.

Когда ERE токен появляется как выражение в любом контексте, кроме как в правой части
'~' or "! ~" оператор или как один из аргументов встроенной функции, описанных ниже,
значение результирующего выражения должно быть эквивалентом:

$0 " " /Черты/

The Черты аргумент к gsub, совпадение, ниже функции и fs аргумент к раскол
функция (см. строка функции) следует интерпретировать как расширенные регулярные выражения.
Это могут быть либо ERE токены или произвольные выражения, и должны интерпретироваться в
так же, как и правая часть '~' or "! ~" оператор.

Расширенное регулярное выражение может использоваться для разделения полей путем присвоения строки
содержащее выражение для встроенной переменной FS, либо прямо, либо как следствие
использования −F разделительная строка вариант. Значение по умолчанию FS переменная должна быть единственной
. Следующее описывает FS поведение:

1. Если FS является пустой строкой, поведение не указано.

2. Если FS это одиночный символ:

а. Если FS является , пропустить начало и конец и символы;
поля должны быть разделены наборами из одного или нескольких или символы.

б. В противном случае, если FS любой другой персонаж c, поля должны быть разделены каждым
единственное появление c.

3. В противном случае строковое значение FS считается расширенным регулярным
выражение. Каждое вхождение последовательности, соответствующей расширенному регулярному выражению
разграничивает поля.

За исключением '~' и "! ~" операторов, а в gsub, совпадение, раскол и ниже встроенный
функции, сопоставление ERE должно быть основано на входных записях; то есть разделитель записей
символов (первый символ значения переменной RS, по умолчанию)
не может быть встроено в выражение, и никакое выражение не должно соответствовать разделителю записи
персонаж. Если разделитель записей не , символы, встроенные в
выражение может быть сопоставлено. Для '~' и "! ~" операторов, и в этих четырех встроенных
функции, соответствие ERE должно быть основано на текстовых строках; то есть любой символ (в том числе
и разделитель записей) могут быть встроены в шаблон, а соответствующий
шаблон должен соответствовать любому символу. Однако во всех AWK ERE сопоставление, использование одного или
больше символов NUL в шаблоне, входной записи или текстовой строке приводит к неопределенному
результаты.

Шаблоны
A описания любой действительный выражение, диапазон, заданный двумя выражениями, разделенными
запятая или один из двух специальных шаблонов НАЧАТЬ or END.

Особый - Special Шаблоны
The AWK утилита должна распознавать два специальных шаблона, НАЧАТЬ и END. Каждый НАЧАТЬ описания
должен быть сопоставлен один раз, и связанное с ним действие должно выполняться перед первой записью ввода
читается - кроме, возможно, использования Getline функция (см. Ввод, вывод и Общие
функции) в предшествующем НАЧАТЬ действие - и до того, как будет выполнено назначение командной строки. Каждый END
шаблон должен быть сопоставлен один раз, и связанное с ним действие должно выполняться после последней записи
ввод был прочитан. Эти два шаблона должны иметь связанные действия.

НАЧАТЬ и END не должны сочетаться с другими узорами. Несколько НАЧАТЬ и END шаблоны должны
позволено, разрешено. Действия, связанные с НАЧАТЬ выкройки выполняются в порядке
указанные в программе, как и END действия. An END шаблон может предшествовать НАЧАТЬ
узор в программе.

Если AWK программа состоит только из действий с шаблоном НАЧАТЬ, и НАЧАТЬ действие
не содержит Getline Функция, AWK должен выйти без чтения своего ввода, когда последний
заявление в последнем НАЧАТЬ действие выполнено. Если AWK программа состоит только из действий
с рисунком END или только действия с шаблонами НАЧАТЬ и END, вход должен быть
прочтите перед заявлениями в END действия выполняются.

Выражение Шаблоны
Шаблон выражения должен оцениваться, как если бы он был выражением в логическом контексте.
Если результат верен, образец считается совпадающим, и соответствующее действие
(если есть) должны быть выполнены. Если результат ложный, действие не выполняется.

шаблон Диапазоны
Диапазон шаблона состоит из двух выражений, разделенных запятой; в этом случае действие
выполняется для всех записей между совпадением первого выражения и
следующее совпадение второго выражения включительно. На этом этапе диапазон паттернов может
повторяться, начиная с входных записей, следующих за концом согласованного диапазона.

Действия
Действие - это последовательность утверждений, как показано в грамматике в Grammar. Любой сингл
оператор можно заменить списком операторов, заключенным в фигурные скобки. Приложение
должен гарантировать, что операторы в списке операторов разделены или
символы. Заявления в списке выписок выполняются последовательно в порядке
что они появляются.

The выражение действуя как условие в if заявление должно быть оценено, и если оно
не равно нулю или не равно нулю, должна быть выполнена следующая инструкция; в противном случае, если еще is
настоящее, заявление, следующее за еще должны быть выполнены.

The if, в то время как, do...в то время как, для, перерыв и продолжать заявления основаны на ISO C
стандарт (см. Раздел 1.1.2, концепции Производный от ISO C Стандарт), за исключением того, что
Булевы выражения должны обрабатываться, как описано в Expressions in AWK, и кроме
в случае если:

для (переменная in массив)

который должен повторяться, присваивая каждому индекс of массив в переменная в неустановленном порядке.
Результаты добавления новых элементов в массив в таком для цикл не определены. Если
перерыв or продолжать оператор происходит вне цикла, поведение не определено.

The удалять оператор удаляет отдельный элемент массива. Таким образом, следующий код
удаляет весь массив:

для (индекс in множество)
удалять массив [индекс]

The следующий оператор должен привести к тому, что вся дальнейшая обработка текущей входной записи будет
заброшенный. Поведение не определено, если следующий оператор появляется или вызывается в НАЧАТЬ
or END действия.

The выход заявление должно ссылаться на все END действия в том порядке, в котором они происходят в
исходный код программы, а затем завершить программу, не считывая дальнейший ввод. An выход
заявление внутри END действие завершает программу без дальнейшего выполнения
END действия. Если выражение указано в выход заявление, его числовое значение должно
быть статусом выхода AWK, если не встречаются последующие ошибки или последующие выход
оператор с выражением выполняется.

Результат Отчеты
Оба формата Распечатать и Printf операторы по умолчанию должны выводиться на стандартный вывод. Выход
пишется по адресу, указанному выходное_перенаправление если поставляется, как
следующим образом:

> выражение
>> выражение
| выражение

Во всех случаях выражение должен быть оценен для получения строки, которая используется как
путь для записи (для '>' or ">>") или как выполняемую команду (для '|').
Используя первые две формы, если файл с таким именем в настоящее время не открыт, он должен быть
открыл, создав его при необходимости и используя первую форму, усекая файл. Выход
затем будет добавлен к файлу. Пока файл остается открытым, последующие вызовы в
, которые выражение оценивает то же строковое значение, должно просто добавлять вывод в
файл. Файл остается открытым до тех пор, пока Закрыть функция (см. Ввод, вывод и Общие
функции) вызывается с выражением, результатом которого является то же строковое значение.

Третья форма должна записывать вывод в поток, переданный на вход команды. В
поток должен быть создан, если в настоящее время не открыт поток со значением выражение как его
имя команды. Созданный поток должен быть эквивалентен потоку, созданному вызовом
открывать(), определенная в томе Системные интерфейсы POSIX.1-2008 со значением
выражение как команду аргумент и значение w как Режим аргумент. Пока
поток остается открытым, последующие вызовы, в которых выражение оценивает ту же строку
value должен записывать вывод в существующий поток. Ручей остается открытым до
Закрыть функция (см. Ввод, вывод и Общие функции) вызывается с выражением, которое
оценивается к тому же строковому значению. В это время поток должен быть закрыт, как если бы
позвонить в закрыть(), определенная в томе Системные интерфейсы POSIX.1-2008.

Как подробно описано в грамматике в Grammar, эти операторы вывода должны принимать
-отделенный список выражениеs упоминается в грамматике нетерминальным
Символы expr_list, print_expr_list или print_expr_list_opt. Этот список упоминается здесь
как выражение список, и каждый член упоминается как выражение аргумент.

The Распечатать оператор должен записывать значение каждого аргумента выражения в указанный
выходной поток, разделенный текущим разделителем выходного поля (см. переменную ОФС выше),
и заканчивается разделителем выходной записи (см. переменную ORS выше). Все выражения
аргументы следует воспринимать как строки, при необходимости конвертируя; это преобразование должно
быть как описано в Expressions in AWK, за исключением того, что Printf отформатировать в ОФМТ
должно использоваться вместо значения в КОНВФМТ. Пустой список выражений означает
вся входная запись ($ 0).

The Printf оператор должен производить вывод на основе нотации, аналогичной формату файла
Обозначения, используемые для описания форматов файлов в этом томе POSIX.1-2008 (см. Базовый
Том определений POSIX.1-2008, Глава 5, Файл Формат Отзывы). Результат должен быть
произведено, как указано в первом выражение аргумент как строка формат и
последующее выражение аргументы как строки arg1 в аргумент, включительно, со следующими
исключения:

1. формат должен быть реальной строкой символов, а не графическим представлением.
Следовательно, он не может содержать пустые позиции символов. В в формат
строка в любом контексте, кроме флажок спецификации преобразования, должны быть
рассматривается как обычный символ, который копируется на вывод.

2. Если набор символов содержит ''и этот символ появляется в формат
строка, он должен рассматриваться как обычный символ, который копируется на вывод.

3. бежать последовательности начиная с персонаж должен рассматриваться как
последовательности обычных символов, которые копируются на вывод. Обратите внимание, что эти же
последовательности должны интерпретироваться лексически AWK когда они появляются в буквальных строках,
но они не должны рассматриваться специально Printf заявление.

4. поле ширина or точность можно указать как '*' символ вместо цифры
нить. В этом случае должен быть выбран следующий аргумент из списка выражений и
его числовое значение, принимаемое за ширину поля или точность.

5. Реализация не должна предшествовать или следовать за результатами d or u Преобразование
символы-спецификаторы с символы, не указанные в формат строка.

6. Реализация не должна предшествовать выходу из o символ спецификатора преобразования
с ведущими нулями, не указанными формат строка.

7. Для c символ спецификатора преобразования: если аргумент имеет числовое значение,
должен быть выведен символ, кодировка которого совпадает с этим значением. Если значение равно нулю или нет
кодировка любого символа в наборе символов, поведение не определено. Если
аргумент не имеет числового значения, первый символ строкового значения должен
быть выводом; если строка не содержит символов, поведение не определено.

8. Для каждой спецификации преобразования, использующей аргумент, следующее выражение
аргумент должен быть оценен. За исключением c спецификатор преобразования
символа, значение должно быть преобразовано (в соответствии с правилами, указанными в
Expressions in AWK) к соответствующему типу для спецификации преобразования.

9. Если аргументов выражения недостаточно для выполнения всех преобразований
спецификации в формат строка, поведение не определено.

10. Если какая-либо последовательность символов в формат строка начинается с '%' характер, но делает
не являются действительной спецификацией преобразования, поведение не определено.

Оба формата Распечатать и Printf может выводить не менее {LINE_MAX} байт.

функции
The AWK язык имеет множество встроенных функций: арифметические, строковые, ввод / вывод,
и вообще.

Арифметический функции
Арифметические функции, кроме Int, должны быть основаны на стандарте ISO C (см.
Раздел 1.1.2, концепции Производный от ISO C Стандарт). Поведение не определено в
случаи, когда стандарт ISO C указывает, что должна быть возвращена ошибка или что поведение
неопределенный. Хотя грамматика (см. Grammar) позволяет встроенным функциям появляться без
аргументы или круглые скобки, если аргумент или круглые скобки не указаны как необязательные в
следующий список (отображая их в "[]" скобки), такое использование не определено.

атан2(y,x)
Вернуть арктангенс y/x в радианах в диапазоне [−π, π].

тележка(x) Возврат косинуса x, Где x в радианах.

без(x) Возврат синуса x, Где x в радианах.

ехр(x) Вернуть экспоненциальную функцию от x.

журнал(x) Верните натуральный логарифм числа x.

SQRT(x) Верните квадратный корень из x.

Int(x) Вернуть аргумент, усеченный до целого числа. Усечение должно быть в сторону 0, когда
x> 0.

все() Вернуть случайное число n, такие что 0≤n

сранд([выраж])
Установите начальное значение для все в выраж или используйте время дня, если выраж опущен
Должно быть возвращено предыдущее начальное значение.

строка функции
Должны поддерживаться строковые функции из следующего списка. Хотя грамматика (см.
Grammar) позволяет встроенным функциям появляться без аргументов или скобок, если только
аргумент или круглые скобки указаны как необязательные в следующем списке (путем отображения
их в "[]" скобки), такое использование не определено.

gsub(Черты, РЕПЛ[, in])
Вести себя как ниже (см. ниже), за исключением того, что он заменяет все вхождения
регулярное выражение (например, ed глобальная замена утилиты) в $ 0 или в in
аргумент, если он указан.

индекс(s, t)
Возвращает позицию в символах, нумерацию от 1, в строке s где строка t
происходит первым или ноль, если не происходит вообще.

длина[([s])]
Возвращает длину в символах его аргумента, взятого как строка, или длины
вся запись, $ 0, если нет аргумента.

совпадение(s, Черты)
Возвращает позицию в символах, нумерацию от 1, в строке s где
расширенное регулярное выражение Черты возникает, или ноль, если не происходит вообще.
RSTART должен быть установлен в начальное положение (которое совпадает с возвращенным
значение), ноль, если совпадений не найдено; RLENGTH устанавливается равным длине
совпадающая строка, -1, если совпадений не найдено.

раскол(s, a[, fs ])
Разделить строку s в элементы массива a[1], a[2], ..., a[n], и вернуться n. Все
элементы массива должны быть удалены перед выполнением разбиения. В
разделение должно производиться с помощью ERE fs или с разделителем полей FS if fs is
не дано. Каждый элемент массива должен иметь строковое значение при создании и, если
соответствующий элемент массива следует рассматривать как числовую строку (см.
Expressions in AWK). Эффект пустой строки как значения fs is
неопределенные.

Sprintf(FMT, выраж, выраж, ...)
Отформатируйте выражения в соответствии с Printf формат, предоставленный FMT и вернуться
получившаяся строка.

sub (Черты, РЕПЛ[, in ])
Заменить строку РЕПЛ вместо первого экземпляра расширенного
регулярное выражение ERE в строке in и вернуть количество замен. An
('&') в строке РЕПЛ заменяется строкой
от in что соответствует ERE. An предшествовал должен
интерпретироваться как буквальный персонаж. Возникновение двух
последовательный символы должны интерпретироваться как единственный литерал
персонаж. Любое другое появление (Например,
предшествующий любому другому символу) должен рассматриваться как буквальный
персонаж. Обратите внимание, что если РЕПЛ является строковым литералом (лексический токен STRING; увидеть
Grammar), обработка символ встречается после любого лексического
обработка, в том числе любые лексические -эскейп обработка последовательности. Если in
указано, и это не lvalue (см. Expressions in AWK) поведение
неопределенный. Если in опущен, AWK будет использовать текущую запись ($ 0) вместо нее.

подстрока(s, m[, n ])
Вернуть самое большее n-символьная подстрока s что начинается с позиции m,
нумерация от 1. Если n опущено, или если n указывает больше символов, чем есть
слева в строке, длина подстроки должна быть ограничена длиной
строки s.

понижать(s)
Вернуть строку на основе строки s. Каждый персонаж в s это прописные буквы
письмо указано, чтобы иметь понижать картографирование LC_CTYPE категория
текущая локаль должна быть заменена в возвращаемой строке строчной буквой
указывается отображением. Другие персонажи в s остается без изменений в
возвращенная строка.

ToUpper(s)
Вернуть строку на основе строки s. Каждый персонаж в s это строчная буква
письмо указано, чтобы иметь ToUpper картографирование LC_CTYPE категория
текущий языковой стандарт заменяется в возвращаемой строке заглавной буквой
указывается отображением. Другие персонажи в s без изменений в возвращенных
строка.

Все предыдущие функции, которые принимают ERE в качестве параметра ожидайте шаблон или строку
оцененное выражение, которое является регулярным выражением, как определено в Стандарт Expressions.

Ввод, вывод и Общие функции
Функции ввода / вывода и общие функции:

Закрыть(выражение)
Закройте файл или канал, открытый Распечатать or Printf заявление или звонок
Getline с тем же строковым значением выражение. Лимит на количество открытых
выражение аргументы определяются реализацией. Если закрытие прошло успешно,
функция должна вернуть ноль; в противном случае он должен вернуть ненулевое значение.

выражение | Getline [вар]
Прочтите запись ввода из потока, переданного по конвейеру из вывода команды. В
поток должен быть создан, если в настоящее время не открыт поток со значением
выражение в качестве имени команды. Созданный поток должен быть эквивалентен одному
созданный призывом к открывать() со значением выражение как
команду аргумент и значение r как Режим аргумент. Пока поток
остается открытым, последующие вызовы, в которых выражение оценивает ту же строку
value должен читать последующие записи из потока. Ручей останется
открыть до Закрыть функция вызывается с выражением, которое оценивается как
то же строковое значение. В это время поток должен быть закрыт, как если бы вызовом
закрыть() функция. Если вар опущено, $ 0 и NF устанавливается; в противном случае, вар
должен быть установлен и, если необходимо, он должен рассматриваться как числовая строка (см.
Expressions in AWK).

The Getline оператор может образовывать неоднозначные конструкции, когда есть
операторы без скобок (включая конкатенацию) слева от '|'
начало выражения, содержащего Getline). В контексте '$'
оператор, '|' должен вести себя так, как если бы он имел более низкий приоритет, чем '$'. Результат
оценки других операторов не указано, и соответствующие приложения должны
правильно заключить в скобки все такие употребления.

Getline Установите $ 0 для следующей входной записи из текущего входного файла. Эта форма
Getline устанавливает NF, NR и FNR переменные.

Getline вар
Установить переменную вар к следующей входной записи из текущего входного файла и, если
соответствующий, вар считается числовой строкой (см. Expressions in AWK).
Эта форма Getline устанавливает FNR и NR переменные.

Getline [вар] < выражение
Прочтите следующую запись ввода из указанного файла. В выражение должен быть
вычисляется для создания строки, которая используется в качестве имени пути. Если файл этого
имя в настоящее время не открыто, оно должно быть открыто. Пока остается поток
открытые, последующие вызовы, в которых выражение оценивает то же самое строковое значение
должен читать последующие записи из файла. Дело остается открытым до
Закрыть функция вызывается с выражением, которое оценивает то же самое
строковое значение. Если вар опущено, $ 0 и NF устанавливается; в противном случае, вар должен быть
набор и, если необходимо, он должен рассматриваться как числовая строка (см.
Expressions in AWK).

The Getline оператор может образовывать неоднозначные конструкции, когда есть
бинарные операторы без скобок (включая конкатенацию) справа от '<'
(до конца выражения, содержащего Getline). Результат
оценка такой конструкции не указана, и соответствующие приложения должны
правильно заключить в скобки все такие употребления.

система(выражение)
Выполните команду, заданную выражение способом, эквивалентным система()
функция, определенная в томе Системные интерфейсы POSIX.1-2008, и возвращает
статус выхода команды.

Все формы Getline должен возвращать 1 для успешного ввода, ноль для конца файла и -1 для
ошибка.

Если в качестве имени файла или конвейера используются строки, приложение должно гарантировать:
что строки идентичны по тексту. Терминология `` одно и то же строковое значение '' подразумевает
что `` эквивалентные строки '', даже те, которые отличаются только персонажи, представляют
разные файлы.

Определяемые пользователем функции
The AWK language также предоставляет пользовательские функции. Такие функции можно определить как:

функция имя([параметр...]) { отчетность }

На функцию можно ссылаться где угодно в AWK программа; в частности, его использование может
предшествовать его определению. Объем функции глобален.

Параметры функции, если они есть, могут быть либо скалярами, либо массивами; поведение
undefined, если имя массива передается как параметр, который функция использует как скаляр, или
если скалярное выражение передается как параметр, который функция использует как массив.
Параметры функции должны передаваться по значению, если скалярный, и по ссылке, если имя массива.

Количество параметров в определении функции не обязательно должно совпадать с количеством
параметры в вызове функции. Лишние формальные параметры можно использовать как локальные переменные.
Если при вызове функции передается меньше аргументов, чем в определении функции,
дополнительные параметры, которые используются в теле функции как скаляры, должны оцениваться как
неинициализированное значение, пока они не будут инициализированы иным образом, и дополнительные параметры, которые
используются в теле функции, поскольку массивы должны рассматриваться как неинициализированные массивы, где
каждый элемент оценивается как неинициализированное значение до тех пор, пока не будет инициализирован иначе.

При вызове функции нельзя ставить пробелы между именем функции и
открывающая скобка. Вызовы функций могут быть вложенными, а рекурсивные вызовы могут выполняться
функции. При возврате из любого вложенного или рекурсивного вызова функции значения всех
параметры вызывающей функции должны быть неизменными, за исключением переданных параметров массива
по ссылке. В возвращают оператор может использоваться для возврата значения. Если возвращают заявление
появляется вне определения функции, поведение не определено.

В определении функции символы должны быть необязательными перед открытием
скобка и после закрывающей скобки. Определения функций могут появляться в любом месте программы.
где паттерн-действие пара допускается.

Grammar
Грамматика в этом разделе и лексические соглашения в следующем разделе должны
вместе описывают синтаксис для AWK программы. Общие условные обозначения этого стиля
грамматика описаны в Раздел 1.3, Grammar конвенции. Действующая программа может быть
представлен как нетерминальный символ программа в грамматике. Этот формальный синтаксис должен
имеют приоритет над предыдущим текстовым описанием синтаксиса.

% токен ИМЯ НОМЕР STRING ERE
% токен FUNC_NAME /* Имя следует by '(' без белый пространстве. */

/ * Ключевые слова * /
% токен Начало Конец
/ * 'НАЧАЛО' 'КОНЕЦ' * /

% token Break Продолжить Удалить Сделать иначе
/ * 'break' 'continue' 'delete' 'do' 'else' * /

% token Exit For Function If In
/ * 'exit' 'для' 'функции' 'if' 'in' * /

% token Next Print Printf Возврат пока
/ * 'next' 'print' 'printf' 'return' 'while' * /

/ * Зарезервированные имена функций * /
% токен BUILTIN_FUNC_NAME
/ * Один токен для следующего:
* atan2 cos sin exp log sqrt int rand srand
* длина индекса gsub соответствует разделению sub sprintf
* Система закрытия substr tolower toupper
*/
% токен GETLINE
/ * Синтаксически отличается от других встроенных модулей. * /

/ * Двухсимвольные токены. * /
% токен ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/ * '+ =' '- =' '* =' '/ =' '% =' '^ =' * /

% token OR AND NO_MATCH EQ LE GE NE INCR DECR APPEND
/ * '||' '&&' '! ~' '==' '<=' '> =' '! =' '++' '−−' '>>' * /

/ * Односимвольные токены. * /
% token '{' '}' '(' ')' '[' ']' ',' ';' НОВАЯ ЛИНИЯ
% token '+' '-' '*' '%' '^' '!' '>' '<' '|' '?' ':' '""' '$' '='

% start program
%%

программа: item_list
| actionless_item_list
;

item_list: newline_opt
| actionless_item_list терминатор элемента
| item_list терминатор элемента
| терминатор действия item_list
;

actionless_item_list: терминатор шаблона item_list
| терминатор шаблона actionless_item_list
;

элемент: действие шаблона
| ИМЯ функции '(' param_list_opt ')'
newline_opt действие
| Функция FUNC_NAME '(' param_list_opt ')'
newline_opt действие
;

param_list_opt: / * пусто * /
| список_параметров
;

param_list: ИМЯ
| param_list ',' ИМЯ
;

Картина: Начало
| Конец
| выражение
| expr ',' newline_opt expr
;

действие: '{' newline_opt '}'
| '{' newline_opt terminated_statement_list '}'
| '{' newline_opt unterminated_statement_list '}'
;

терминатор: терминатор ';'
| терминатор NEWLINE
| ';'
| НОВАЯ ЛИНИЯ
;

terminated_statement_list: terminated_statement
| завершённый_оператор_список
;

unterminated_statement_list: unterminated_statement
| завершённый_оператор_список нетерминированный_оператор
;

terminated_statement: действие newline_opt
| Если '(' выражение ')' newline_opt terminated_statement
| Если '(' выражение ')' newline_opt terminated_statement
Иначе newline_opt terminated_statement
| В то время как '(' expr ')' newline_opt terminated_statement
| Для '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
прекращенное_оператор
| Для '(' ИМЯ В ИМЯ ')' newline_opt
прекращенное_оператор
| ';' newline_opt
| terminable_statement NEWLINE newline_opt
| terminatable_statement ';' newline_opt
;

unterminated_statement: terminatable_statement
| Если '(' выражение ')' newline_opt unterminated_statement
| Если '(' выражение ')' newline_opt terminated_statement
Иначе newline_opt unterminated_statement
| В то время как '(' expr ')' newline_opt unterminated_statement
| Для '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
нетерминированное_выражение
| Для '(' ИМЯ В ИМЯ ')' newline_opt
нетерминированное_выражение
;

terminatable_statement: simple_statement
| Перерыв
| Продолжать
| следующий
| Выйти из expr_opt
| Возврат expr_opt
| Сделать newline_opt terminated_statement Пока '(' expr ')'
;

simple_statement_opt: / * пусто * /
| простое_утверждение
;

simple_statement: Удалить ИМЯ '[' список_выражений ']'
| выражение
| print_statement
;

print_statement: simple_print_statement
| simple_print_statement выходное_перенаправление
;

simple_print_statement: Печать print_expr_list_opt
| Распечатать '(' multiple_expr_list ')'
| Printf print_expr_list
| Printf '(' список_множественных_выражений ')'
;

output_redirection: '>' выражение
| ДОБАВИТЬ выражение
| '|' expr
;

expr_list_opt: / * пусто * /
| expr_list
;

expr_list: expr
| Multiple_expr_list
;

multiple_expr_list: expr ',' newline_opt выражение
| multiple_expr_list ',' newline_opt выражение
;

expr_opt: / * пусто * /
| выражение
;

выражение: unary_expr
| non_unary_expr
;

unary_expr: '+' выражение
| '-' выражение
| unary_expr '^' expr
| unary_expr '*' выражение
| unary_expr '/' expr
| unary_expr '%' expr
| unary_expr '+' expr
| unary_expr '-' выражение
| унарное_выражение не_унарное_выражение
| unary_expr '<' выражение
| unary_expr LE выражение
| unary_expr NE выражение
| unary_expr Выражение эквалайзера
| unary_expr '>' expr
| unary_expr GE выражение
| unary_expr '~' выражение
| unary_expr NO_MATCH выражение
| unary_expr в NAME
| unary_expr И newline_opt expr
| unary_expr ИЛИ newline_opt expr
| unary_expr '?' expr ':' expr
| унарная_input_function
;

non_unary_expr: '(' выражение ')'
| '!' expr
| non_unary_expr '^' выражение
| non_unary_expr '*' выражение
| non_unary_expr '/' выражение
| non_unary_expr '%' expr
| non_unary_expr '+' выражение
| non_unary_expr '-' выражение
| non_unary_expr non_unary_expr
| non_unary_expr '<' выражение
| non_unary_expr LE выражение
| non_unary_expr NE выражение
| non_unary_expr Выражение эквалайзера
| non_unary_expr '>' выражение
| non_unary_expr Выражение GE
| non_unary_expr '~' выражение
| non_unary_expr NO_MATCH выражение
| non_unary_expr в NAME
| '(' multiple_expr_list ')' в NAME
| Non_unary_expr И выражение новой строки_opt
| non_unary_expr ИЛИ newline_opt expr
| non_unary_expr '?' expr ':' expr
| КОЛИЧЕСТВО
| НИТЬ
| lvalue
| ЭРЭ
| lvalue INCR
| lvalue DECR
| INCR lзначение
| DECR lvalue
| lvalue POW_ASSIGN выражение
| lvalue MOD_ASSIGN выражение
| lvalue MUL_ASSIGN выражение
| lvalue DIV_ASSIGN выражение
| lvalue ADD_ASSIGN выражение
| lvalue SUB_ASSIGN выражение
| lvalue '=' выражение
| FUNC_NAME '(' expr_list_opt ')'
/ * перед '(' * /
| BUILTIN_FUNC_NAME '(' список_выражений ')'
| BUILTIN_FUNC_NAME
| не_unary_input_function
;

print_expr_list_opt: / * пусто * /
| print_expr_list
;

print_expr_list: print_expr
| print_expr_list ',' newline_opt print_expr
;

print_expr: unary_print_expr
| non_unary_print_expr
;

unary_print_expr: '+' print_expr
| '-' print_expr
| unary_print_expr '^' print_expr
| unary_print_expr '*' print_expr
| unary_print_expr '/' print_expr
| unary_print_expr '%' print_expr
| unary_print_expr '+' print_expr
| unary_print_expr '-' print_expr
| unary_print_expr не_unary_print_expr
| unary_print_expr '~' print_expr
| unary_print_expr NO_MATCH print_expr
| unary_print_expr в NAME
| unary_print_expr И newline_opt print_expr
| unary_print_expr ИЛИ newline_opt print_expr
| unary_print_expr '?' print_expr ':' print_expr
;

non_unary_print_expr: '(' выражение ')'
| '!' print_expr
| non_unary_print_expr '^' print_expr
| non_unary_print_expr '*' print_expr
| non_unary_print_expr '/' print_expr
| non_unary_print_expr '%' print_expr
| non_unary_print_expr '+' print_expr
| non_unary_print_expr '-' print_expr
| non_unary_print_expr non_unary_print_expr
| non_unary_print_expr '~' print_expr
| non_unary_print_expr NO_MATCH print_expr
| non_unary_print_expr в NAME
| '(' multiple_expr_list ')' в NAME
| non_unary_print_expr И newline_opt print_expr
| non_unary_print_expr ИЛИ newline_opt print_expr
| non_unary_print_expr '?' print_expr ':' print_expr
| КОЛИЧЕСТВО
| НИТЬ
| lvalue
| ЭРЭ
| lvalue INCR
| lvalue DECR
| INCR lзначение
| DECR lvalue
| lvalue POW_ASSIGN print_expr
| lvalue MOD_ASSIGN print_expr
| lvalue MUL_ASSIGN print_expr
| lvalue DIV_ASSIGN print_expr
| lvalue ADD_ASSIGN print_expr
| lvalue SUB_ASSIGN print_expr
| lvalue '=' print_expr
| FUNC_NAME '(' expr_list_opt ')'
/ * перед '(' * /
| BUILTIN_FUNC_NAME '(' список_выражений ')'
| BUILTIN_FUNC_NAME
;

lvalue: ИМЯ
| ИМЯ '[' список_выражений ']'
| '$' выражение
;

non_unary_input_function: simple_get
| simple_get '<' выражение
| non_unary_expr '|' simple_get
;

unary_input_function: unary_expr '|' simple_get
;

simple_get: GETLINE
| ПОЛУЧИТЬ L-значение
;

newline_opt: / * пусто * /
| newline_opt НОВАЯ ЛИНИЯ
;

В этой грамматике есть несколько двусмысленностей, которые необходимо разрешить следующим образом:

* Приоритет и ассоциативность операторов должны соответствовать описанию в Таблица 4-1, Expressions
in Убывающий старшинство in AWK.

* В случае неясности еще должны быть связаны с наиболее непосредственно предшествующим
if это удовлетворило бы грамматику.

* В некоторых контекстах ('/'), который используется для окружения ERE, также может быть
оператор деления. Это должно быть решено таким образом, чтобы где бы ни произошло разделение
может появиться оператор предполагается, что это оператор деления. (Здесь нет
оператор унарного деления.)

Каждое выражение в AWK программа должна соответствовать правилам приоритета и ассоциативности,
даже если это не требуется для разрешения неоднозначности. Например, потому что '$' имеет более высокий
приоритет, чем '++', строка "$ x ++ −−" не является действительным AWK выражение, хотя это
однозначно разбирается грамматикой как "$ (x ++) −−".

Одно соглашение, которое может быть неочевидным из формальной грамматики, заключается в том, что
допустимы символы. Есть несколько очевидных вариантов размещения, таких как прекращение
заявление, и можно использовать для побега символы между любыми
лексические токены. Кроме того, персонажи без персонажи могут
после запятой, открытой фигурной скобки, логического оператора И ("&&"), логический оператор ИЛИ ("||"),
do ключевое слово, еще ключевое слово и закрывающая скобка if, для или в то время как
утверждение. Например:

{ Распечатать $ 1,
$2 }

лексический конвенции
Лексические соглашения для AWK программы по отношению к предыдущей грамматике должны быть
следующим образом:

1. Если не указано иное, AWK должен распознавать как можно более длинный токен или начало разделителя
в данный момент.

2. Комментарий должен состоять из любых символов, начинающихся с персонаж
и завершается, но исключая следующее вхождение, a . Комментарии должны
не имеют никакого эффекта, кроме разграничения лексических лексем.

3. В признается токеном НОВАЯ ЛИНИЯ.

4. А символ, сразу за которым следует не будет иметь никакого эффекта.

5. Жетон STRING представляет собой строковую константу. Строковая константа должна начинаться с
персонаж '"'. Внутри строковой константы характер должен быть
считается началом escape-последовательности, как указано в таблице в Базе
Том определений POSIX.1-2008, Глава 5, Файл Формат Отзывы ('\\', '\ а', '\ b',
'\ f', '\ n', '\р', «\ Т», '\ v'). Кроме того, escape-последовательности в Таблица 4-2, Побег
Последовательности in AWK должны быть признаны. А не должно встречаться в строке
постоянный. Строковая константа должна заканчиваться первым неэкранированным появлением
персонаж '"' после того, с которого начинается строковая константа. Ценность
строка должна быть последовательностью всех неэкранированных символов и значений escape
последовательности между двумя ограничивающими '"' символы.

6. Жетон ERE представляет собой константу расширенного регулярного выражения. Константа ERE
начнем с персонаж. В пределах константы ERE
считается, что символ начинает escape-последовательность, как указано в таблице в
том Базовых определений POSIX.1-2008, Глава 5, Файл Формат Отзывы. В
кроме того, escape-последовательности в Таблица 4-2, Побег Последовательности in AWK должен быть
признал. Приложение должно гарантировать, что не происходит в ERE
постоянный. Константа ERE должна завершаться первым неэкранированным появлением
после символа, начинающегося с константы ERE. Расширенный регулярный
выражение, представленное константой ERE, должно быть последовательностью всех неэкранированных
символы и значения управляющих последовательностей между двумя
разграничение символы.

7. А не имеет никакого эффекта, за исключением разграничения лексических лексем или внутри STRING or
ERE жетоны.

8. Жетон НОМЕР представляет собой числовую константу. Его форма и числовое значение должны
либо быть эквивалентным десятичная константа с плавающей запятой токен, как указано в стандарте ISO C
стандарт, или это должна быть последовательность десятичных цифр и должна оцениваться как
целочисленная константа в десятичном формате. Кроме того, реализации могут принимать числовые константы.
с формой и числовым значением, эквивалентным шестнадцатеричная константа и
шестнадцатеричная константа с плавающей запятой токены в соответствии со стандартом ISO C.

Если значение слишком велико или слишком мало для представления (см. Раздел 1.1.2,
концепции Производный от ISO C Стандарт) поведение не определено.

9. Последовательность знаков подчеркивания, цифр и букв из переносимого набора символов.
(см. том Базовых определений POSIX.1-2008, Раздел 6.1, Портативная Характер
Поставьте), начиная с или буквенный знак, считается
слова.

10. Следующие слова являются ключевыми словами, которые должны распознаваться как отдельные токены; в
имя токена совпадает с ключевым словом:

НАЧАТЬ удалять END функция in Printf
перерыв do выход Getline следующий возвращают
продолжать еще для if Распечатать в то время как

11. Следующие слова являются названиями встроенных функций и должны распознаваться как
знак BUILTIN_FUNC_NAME:

атан2 gsub журнал раскол ниже ToUpper
Закрыть индекс совпадение Sprintf подстрока
тележка Int все SQRT система
ехр без сранд понижать

Перечисленные выше ключевые слова и названия встроенных функций считаются зарезервированными.
слова.

12. Жетон ИМЯ должен состоять из слова, которое не является ключевым словом или именем встроенного
функция и не следует сразу (без каких-либо разделителей) '('
характер.

13. Жетон FUNC_NAME должен состоять из слова, которое не является ключевым словом или названием
встроенная функция, за которой сразу (без разделителей) следует '(' характер.
The '(' символ не должен входить в состав токена.

14. Следующие двухсимвольные последовательности признаются именованными токенами:

┌───────────┬───────────┬────────────┬───────────
Токены ИмяПоследовательностьТокены ИмяПоследовательность
├───────────┼───────────┼────────────┼───────────
ДОБАВИТЬ_АССИГН │ + = │ НЕ СОВПАДАЕТ │! ~ │
SUB_ASSIGN │ - = │ EQ │ == │
MUL_ASSIGN │ * = │ LE │ <= │
DIV_ASSIGN │ / = │ GE │> = │
MOD_ASSIGN │% = │ NE │! = │
POW_ASSIGN │ ^ = │ ИНКР │++ │
OR │ || │ ОВЦС │ −− │
И │ && │ ДОБАВИТЬ │ >> │
└───────────┴───────────┴────────────┴───────────
15. Следующие одиночные символы должны распознаваться как жетоны, имена которых являются
персонаж:

{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =

Между токеном существует лексическая двусмысленность ERE и жетоны '/' и DIV_ASSIGN.
Когда входная последовательность начинается с символ в любом синтаксическом контексте, где
знак '/' or DIV_ASSIGN может появиться в качестве следующего токена в действующей программе, чем дольше
те два токена, которые могут быть распознаны, должны быть признаны. В любом другом синтаксисе
контекст, в котором токен ERE может появиться в качестве следующего токена в действующей программе, токен
ERE должны быть признаны.

ВЫХОД статус


Должны быть возвращены следующие значения выхода:

0 Все входные файлы были успешно обработаны.

> 0 Произошла ошибка.

Статус выхода можно изменить в программе, используя выход выражение.

ПОСЛЕДСТВИЯ OF ОШИБКИ


Если файл указан операнд, и указанный файл недоступен, AWK напишу
диагностическое сообщение к стандартной ошибке и прекратить без каких-либо дополнительных действий.

Если программа указана программа операнд или прогфайл операнд не
действительный AWK программы (как указано в разделе РАСШИРЕННОЕ ОПИСАНИЕ), поведение
неопределенный.

The после разделах информативный.

ЗАЯВЛЕНИЕ ИСПОЛЬЗОВАНИЕ


The индекс, , совпадение и подстрока функции не следует путать с аналогичными
функции в стандарте ISO C; в AWK версии имеют дело с символами, в то время как ISO C
стандарт имеет дело с байтами.

Поскольку операция конкатенации представлена ​​смежными выражениями, а не
явного оператора, часто бывает необходимо использовать круглые скобки для обеспечения правильного
приоритет оценки.

ПРИМЕРЫ


The AWK программу, указанную в командной строке, проще всего указать в одно-
кавычки (например, 'программа') для приложений, использующих sh, потому как AWK программы обычно
содержат символы, которые являются специальными для оболочки, включая двойные кавычки. В случаях
где AWK программа содержит символы одинарных кавычек, обычно проще всего указать
большая часть программы в виде строк в одинарных кавычках, объединенных оболочкой в ​​кавычки
одинарные кавычки. Например:

AWK '/' \ '' / { Распечатать "Цитировать:", $0 }'

печатает все строки из стандартного ввода, содержащие символ одинарной кавычки с префиксом
цену:.

Ниже приведены примеры простых AWK программы:

1. Запишите в стандартный вывод все входные строки, для которых поле 3 больше 5:

$3 > 5

2. Каждую десятую строчку напишите:

(НР % 10) == 0

3. Напишите любую строку с подстрокой, соответствующей регулярному выражению:

/ (G | D) (2 [0−9] [[: alpha:]] *) /

4. Выведите любую строку с подстрокой, содержащей 'ГРАММ' or 'D', за которым следует последовательность
цифры и символы. В этом примере используются классы символов цифра и альфа чтобы соответствовать
не зависящие от языка цифры и буквенные символы соответственно:

/ (G | D) ([[: цифра:] [: альфа:]] *) /

5. Напишите любую строку, в которой второе поле соответствует регулярному выражению, а четвертое.
поле не:

$2 " " / xyz / && $4 ! " " / xyz /

6. Напишите любую строку, в которой второе поле содержит :

$2 " " / \\ /

7. Напишите любую строку, в которой второе поле содержит . Обратите внимание, что
-эскейпы интерпретируются дважды; один раз при лексической обработке строки
и один раз при обработке регулярного выражения:

$2 " " "\\\\"

8. Запишите второе до последнего и последнее поле в каждой строке. Разделите поля символом
:

{OFS = ":"; печать $ (NF − 1), $ NF}

9. Напишите номер строки и количество полей в каждой строке. Три струны
представляющий номер строки, , а количество полей объединяется
и эта строка выводится на стандартный вывод:

{Распечатать NR «» НФ}

10. Напишите строки длиннее 72 символов:

длина ($ 0) > 72

11. Запишите первые два поля в обратном порядке, разделив их ОФС:

{ Распечатать $ 2, $1 }

12. То же, с полями ввода, разделенными или и персонажи, или
и то и другое:

НАЧАТЬ { FS = ", [ \ t] * | [ \ t] + " }
{ Распечатать $ 2, $1 }

13. Сложите первый столбец, выведите сумму и среднее значение:

{s += $1 }
END {Распечатать "сумма is ", s, " в среднем является", s / NR}

14. Запишите поля в обратном порядке, по одному в строке (много строк на каждую строку):

{ для (i = НФ; i > 0; −−и) Распечатать $i }

15. Напишите все строки между вхождениями строк. Начало и остановить:

/Начало/, /останавливаться/

16. Напишите все строки, первое поле которых отличается от предыдущего:

$1 != Предыдущая { Распечатать; Предыдущая = $1 }

17. Моделируйте эхо:

НАЧАТЬ {
для (i = 1; i < АРГК; ++ i)
printf ("% s% s", ARGV [i], i == ARGC − 1? "\ n": " ")
}

18. Напишите префиксы пути, содержащиеся в PATH переменная среды, по одной в строке:

НАЧАТЬ {
n = раскол (ОКРУЖЕНИЕ ["ПУТЬ"], дорожка, ":")
для (i = 1; i <= n; ++ i)
Распечатать путь [i]
}

19. Если есть файл с именем вход содержащие заголовки страниц в форме: Страница №

и файл с именем программа это содержит:

/Страница/ { $2 = n ++; }
{ Распечатать }

затем командная строка:

AWK -f программа п = 5 вход

печатает файл вход, заполнив номера страниц, начиная с 5.

ОБОСНОВАНИЕ


Это описание основано на новом AWK, `` nawk '', (см. упомянутую The AWK
Программирование Язык), который привнес ряд новых особенностей в исторический AWK:

1. Новые ключевые слова: удалять, do, функция, возвращают

2. Новые встроенные функции: атан2, Закрыть, тележка, gsub, совпадение, все, без, сранд, ниже, система

3. Новые предопределенные переменные: FNR, АРГК, АРГВ, RСТАРТ, ДЛИНА, ПОДПИСЬ

4. Новые операторы выражения: ?, :, ,, ^

5. FS переменная и третий аргумент для раскол, теперь рассматривается как расширенный обычный
выражения.

6. Приоритет операторов изменен для более точного соответствия языку C. Два примера
кода, которые работают по-разному:

в то время как ( n /= 10 > 1) ...
if (! "нед" ~ / bwk /) ...

Несколько функций были добавлены на основе более новых реализаций AWK:

* Несколько экземпляров -f прогфайл разрешены.

* Новая опция -v назначение.

* Новая предопределенная переменная ОКРУЖАЮЩАЯ СРЕДА.

* Новые встроенные функции ToUpper и понижать.

* Дополнительные возможности форматирования добавлены к Printf чтобы соответствовать стандарту ISO C.

Общая AWK синтаксис всегда был основан на языке C, с некоторыми особенностями от
командный язык оболочки и другие источники. Из-за этого не полностью
совместим с любым другим языком, что вызвало недоумение у некоторых пользователей. Нет
намерение разработчиков стандарта решать такие проблемы. Несколько относительно незначительных
внесены изменения, направленные на то, чтобы сделать язык более совместимым со стандартом ISO C; самый
из этих изменений основаны на аналогичных изменениях в последних реализациях, как описано
выше. Остается несколько соглашений на языке C, которых нет в AWK Одна из
примечательными из них являются оператор, который обычно используется для указания нескольких
выражения на языке C для утверждение. Также есть разные места, где AWK is
более строгие, чем язык C, в отношении типа выражения, которое может использоваться в
в данном контексте. Эти ограничения связаны с различными функциями, которые AWK язык
обеспечивает.

Регулярные выражения в AWK были несколько расширены от исторических реализаций до
сделать их чистым надмножеством расширенных регулярных выражений, как определено в POSIX.1-2008 (см.
том Базовых определений POSIX.1-2008, Раздел 9.4, Расширенный пакет Стандарт Expressions).
Основными расширениями являются функции интернационализации и интервальные выражения. Исторический
реализации AWK давно поддерживали -escape последовательности как расширение
расширенные регулярные выражения, и это расширение было сохранено, несмотря на несогласованность
с другими утилитами. Количество escape-последовательностей, распознаваемых как в расширенных обычных
выражения и строки варьировались (как правило, увеличивались со временем) в разных реализациях.
Набор, указанный в POSIX.1-2008, включает большинство последовательностей, которые, как известно, поддерживаются популярными
реализациями и стандартом ISO C. Одна неподдерживаемая последовательность:
шестнадцатеричное значение начинается с '\Икс'. Это позволило бы значениям, выраженным в большем количестве
чем 9 бит, которые будут использоваться в AWK как в стандарте ISO C. Однако, поскольку этот синтаксис
имеет недетерминированную длину, он не позволяет последующему символу быть
шестнадцатеричная цифра. С этим ограничением можно справиться в языке C, используя
конкатенация лексических строк. в AWK язык, конкатенация также может быть решением
для строк, но не для расширенных регулярных выражений (либо лексических токенов ERE, либо
строки, используемые динамически как регулярные выражения). Из-за этого ограничения функция
не был добавлен в POSIX.1-2008.

Когда строковая переменная используется в контексте, где обычно расширенное регулярное выражение
появляется (где лексический токен ERE используется в грамматике) строка не содержит
буквальный символы.

Некоторые версии AWK разрешить форму:

FUNC имя (аргументы, ... ) { отчетность }

Это было объявлено устаревшим авторами языка, которые попросили, чтобы это не было
указано.

Исторические реализации AWK выдает ошибку, если следующий инструкция выполняется в
НАЧАТЬ действие и причина AWK прекратить, если следующий инструкция выполняется в END действия.
Такое поведение не было задокументировано, и не предполагалось, что это необходимо
стандартизируйте его.

Спецификация преобразований между строковыми и числовыми значениями гораздо более подробна.
чем в документации исторических реализаций или в упомянутых The AWK
Программирование Язык. Хотя большая часть поведения спроектирована так, чтобы быть интуитивно понятным,
подробности необходимы для обеспечения совместимости поведения из разных реализаций. Этот
особенно важен в реляционных выражениях, поскольку типы операндов
определить, выполняется ли строковое или числовое сравнение. С точки зрения
разработчика приложений, обычно достаточно ожидать интуитивного поведения и заставить
преобразования (путем добавления нуля или объединения пустой строки), когда тип выражения
явно не соответствует тому, что нужно. Намерение состояло в том, чтобы указать исторические
Практика почти во всех случаях. Единственным исключением является то, что в исторических реализациях
переменные и константы сохраняют строковые и числовые значения после их исходного значения
конвертируется при любом использовании. Это означает, что ссылка на переменную или константу может иметь
неожиданные побочные эффекты. Например, с историческими реализациями следующие
программа:

{
a = "+2"
b = 2
if (НР % 2)
c = a + b
if (a == b)
Распечатать "числовой сравнение"
еще
Распечатать "нить сравнение"
}

будет выполнять числовое сравнение (и выводить числовое сравнение) для каждого нечетного
строки, но выполнить сравнение строк (и сравнение строк вывода) для каждого четного
нумерованная строка. POSIX.1-2008 гарантирует, что при необходимости сравнения будут числовыми. С участием
исторические реализации, следующая программа:

НАЧАТЬ {
ОФМТ = "% e"
Распечатать 3.14
ОФМТ = "% f"
Распечатать 3.14
}

выведет "3.140000e + 00" дважды, потому что во втором Распечатать константа
"3.14" будет иметь строковое значение из предыдущего преобразования. POSIX.1-2008 требует, чтобы
выход второй Распечатать заявление быть "3.140000". Поведение исторического
реализация рассматривалась как слишком неинтуитивная и непредсказуемая.

Было отмечено, что с правилами, содержащимися в ранних черновиках, следующий сценарий
ничего не напечатает:

НАЧАТЬ {
y [1.5] = 1
ОФМТ = "% e"
Распечатать y [1.5]
}

Следовательно, новая переменная, КОНВФМТ, был представлен. В ОФМТ переменная теперь ограничена
влияет на преобразование выходных чисел в строки и КОНВФМТ используется для внутреннего
преобразования, такие как сравнения или индексация массивов. Значение по умолчанию такое же, как и
для ОФМТ, поэтому, если программа не изменится КОНВФМТ (чего не могла бы сделать ни одна историческая программа), это
получит историческое поведение, связанное с внутренними преобразованиями строк.

POSIX AWK лексические и синтаксические соглашения определены более формально, чем в других
источники. И снова цель состояла в том, чтобы конкретизировать историческую практику. Одно соглашение, которое может
не быть очевидным из формальной грамматики, как и в других словесных описаниях, где
допустимы символы. Есть несколько очевидных вариантов размещения, таких как прекращение
заявление, и можно использовать для побега символы между любыми
лексические токены. Кроме того, персонажи без персонажи могут
после запятой, открытой фигурной скобки, логического оператора И ("&&"), логический оператор ИЛИ
("||") do ключевое слово, еще ключевое слово и закрывающая скобка if, для или
в то время как утверждение. Например:

{ Распечатать $ 1,
$2 }

Требование, чтобы AWK добавить трейлинг текст аргумента программы должен
упростить грамматику, чтобы она соответствовала текстовому файлу по форме. Нет возможности
приложение или набор тестов, чтобы определить, добавлен или AWK
просто действует так, как если бы это было так.

POSIX.1-2008 требует нескольких изменений по сравнению с историческими реализациями для поддержки
интернационализация. Вероятно, самым тонким из них является использование десятичной точки.
характер, определяемый LC_NUMERIC категория локали, в представлениях
числа с плавающей запятой. Этот зависящий от языкового стандарта символ используется для распознавания числовых
input, при преобразовании между строками и числовыми значениями и при форматировании вывода.
Однако независимо от локали символ (десятичный знак символа
POSIX locale) - десятичный знак, распознаваемый при обработке. AWK программы
(включая назначения в аргументах командной строки). По сути, это то же соглашение
как тот, который используется в стандарте ISO C. Разница в том, что язык C включает
установить локаль(), которая позволяет приложению изменять свой языковой стандарт. Из-за этого
возможность, приложение C начинает выполнение с локалью, установленной на локаль C, и только
выполняется в локали, указанной в среде, после явного вызова установить локаль().
Однако добавление такой сложной новой функции в AWK язык рассматривался как
не подходит для POSIX.1-2008. Возможно выполнение AWK программа явно в любом
желаемый языковой стандарт, установив среду в оболочке.

Неопределенное поведение, возникающее из-за NUL в расширенных регулярных выражениях, позволяет в будущем
расширения для GNU простофиля программа для обработки двоичных данных.

Поведение в случае недействительности AWK программы (включая лексические, синтаксические и
семантические ошибки) не определен, поскольку считался чрезмерно ограничивающим для реализаций
указать. В большинстве случаев можно ожидать, что такие ошибки приведут к диагностике и неисправности.
нулевой статус выхода. Однако некоторые реализации могут захотеть расширить язык способами
которые используют определенные недопустимые конструкции. Другие недопустимые конструкции могут считаться
достойны предупреждения, но в остальном вызывают некоторое разумное поведение. Еще другие конструкции
может быть очень трудно обнаружить в некоторых реализациях. Также разные реализации
может обнаружить данную ошибку во время первоначального анализа программы (перед чтением любого
входных файлов), в то время как другие могут обнаружить его при выполнении программы после прочтения некоторых
Вход. Разработчики должны знать, что диагностика ошибок как можно раньше и
проведение полезной диагностики может облегчить отладку приложений и, таким образом, сделать
реализация более удобная.

Неопределенное поведение при использовании нескольких символов RS ценности, чтобы позволить возможное будущее
расширения, основанные на расширенных регулярных выражениях, используемых для разделителей записей. Исторический
реализации принимают первый символ строки и игнорируют остальные.

Неопределенное поведение при раскол(string,массив, ) используется, чтобы разрешить предполагаемое будущее
расширение, которое разбивает строку на массив отдельных символов.

В контексте Getline функция, одинаково хорошие аргументы для разных приоритетов
| и < операторы могут быть сделаны. Историческая практика такова:

Getline < «А» "б"

разбирается как:

( Getline < «А» ) "б"

хотя многие утверждают, что целью файла ab следует читать. Тем не мение:

Getline < "Икс" + 1

разбирается как:

Getline < ( "Икс" + 1 )

Подобные проблемы возникают с | версии Getline, особенно в сочетании с $.
Например:

$ "эхо Привет" | Getline

(Эта ситуация особенно проблематична при использовании в Распечатать Скажите, где
| getline часть может быть перенаправлением Распечатать.)

Поскольку в большинстве случаев такие конструкции не используются (или, по крайней мере, не должны) использоваться (потому что они
имеют естественную двусмысленность, для которой нет обычного синтаксического анализа), значение этих
конструкции были сделаны явно неуказанными. (Эффект состоит в том, что соответствующий
приложение, которое сталкивается с проблемой, должно заключить в скобки, чтобы устранить двусмысленность.)
оказалось, что таких конструкций мало, если они вообще используются.

Могут быть написаны грамматики, которые при таких обстоятельствах вызовут ошибку. Где
обратная совместимость не является большой проблемой, разработчики могут захотеть использовать такие
грамматики.

Некоторые исторические реализации позволяли вызывать некоторые встроенные функции без
список аргументов, результатом которого является список аргументов по умолчанию, выбранный в некоторых `` разумных ''
способ. Использование как синоним длина ($ 0) единственная из этих форм, которая
считается широко известным или широко используемым; эта конкретная форма задокументирована в различных
места (например, самые исторические AWK справочные страницы, хотя и не в упомянутых
The AWK Программирование Язык) как законная практика. За этим исключением по умолчанию
списки аргументов всегда были недокументированы и неопределенно определены, и это совсем не
ясно, как (или если) они должны быть обобщены до пользовательских функций. Они не добавляют полезного
функциональность и исключить возможные будущие расширения, которым может потребоваться наименование функций
не звоня им. Несоблюдение их стандартизации кажется самым простым решением. Стандарт
разработчики посчитали, что заслуживает особого отношения, однако, поскольку
задокументированы в прошлом и, возможно, существенно используются в исторических программах.
Соответственно, это использование было признано законным, но Выпуск 5 удалил устаревшие
маркировка для XSI-совместимых реализаций и многих других совместимых приложений
зависят от этой функции.

In ниже и gsub, Если РЕПЛ является строковым литералом (лексический токен STRING), то два
последовательный в строке следует использовать символы, чтобы обеспечить единичный
будет предшествовать когда результирующая строка передается в
функция. (Например, чтобы указать один литерал в строке замены используйте
gsub(ERE, "\\ &").)

Исторически сложилось так, что единственный особенный персонаж в РЕПЛ аргумент ниже и gsub string
функции были ('&') и предшествующий ему
символ использовался, чтобы отключить его особое значение.

Описание в стандарте ISO POSIX-2: 1993 ввело такое поведение, что
символ был другим специальным персонажем, и не уточнялось, есть ли
были любые другие специальные символы. Это описание ввело несколько переносимости
проблемы, некоторые из которых описаны ниже, поэтому он был заменен на более
историческое описание. Некоторые из проблем включают:

* Исторически сложилось так, что для создания строки замены сценарий мог использовать gsub(ERE, "\\ &"),
но со стандартной формулировкой ISO POSIX-2: 1993 было необходимо использовать gsub(ERE,
"\\\\ &"). В здесь удваиваются символы, потому что все строковые литералы
подлежит лексическому анализу, который уменьшит каждую пару персонажей
один перед тем как быть переданным gsub.

* Поскольку не было указано, какие были специальные символы, для переносимых сценариев
гарантировать, что символы печатаются буквально, каждому символу нужно было предшествовать
с . (Например, переносимый скрипт должен был использовать gsub(ERE, "\\Привет"), Чтобы
произвести замену строки "Привет".)

Описание для сравнений в стандарте ISO POSIX-2: 1993 не описывает должным образом
историческая практика из-за способа сравнения числовых строк как чисел. В
текущие правила вызывают следующий код:

if (0 == "000")
Распечатать "странный, но истинный"
еще
Распечатать "нет истинный"

для числового сравнения, в результате чего if преуспеть. Это должно быть интуитивно очевидно
что это неправильное поведение и, действительно, не историческая реализация AWK на самом деле
так себя ведет.

Чтобы решить эту проблему, определение числовой string был расширен, чтобы включить только те
значения, полученные из конкретных обстоятельств (в основном из внешних источников), где это не
можно однозначно определить, должно ли значение быть строкой или
числовой.

Переменные, присвоенные числовой строке, также должны рассматриваться как числовая строка.
(Например, понятие числовой строки может распространяться по присвоениям.)
сравнения, все переменные, имеющие неинициализированное значение, должны рассматриваться как числовые
операнд, вычисляющий нулевое числовое значение.

Неинициализированные переменные включают все типы переменных, включая скаляры, элементы массива,
и поля. Определение неинициализированного значения в Переменные показатели и Особый - Special Переменные показатели is
необходимо для описания значения, помещенного в неинициализированные переменные и в поля, которые
действительный (например, < $ NF), но не содержать символов, и описать, как эти
переменные должны использоваться при сравнении. Допустимое поле, например $1, в котором нет символов
в нем можно получить из входной строки "\ т \ т" когда FS = '\ t', Исторически
сравнение (1 доллар10) было выполнено численно после оценки $1 к нулевому значению.

Фраза `` ... также должна иметь числовое значение числовой строки '' была удалена
из нескольких разделов стандарта ISO POSIX-2: 1993, поскольку в нем указывается ненужный
деталь реализации. В POSIX.1-2008 нет необходимости указывать, что эти объекты
могут быть присвоены два разных значения. Необходимо только указать, что эти объекты могут
оценивают два разных значения в зависимости от контекста.

Исторические реализации AWK не анализировал шестнадцатеричные целые или плавающие константы
" У аборигенов «0xa» и "0xap0". В связи с недосмотром издания 2001–2004 гг.
стандартная обязательная поддержка шестнадцатеричных констант с плавающей запятой. Это произошло из-за
ссылка на в(). Эта версия стандарта позволяет, но не требует
реализации для использования в() и включает описание того, как числа с плавающей запятой
признана альтернативой историческому поведению. Цель этого изменения -
позволяют реализациям распознавать константы с плавающей запятой в соответствии с
Стандарт ISO / IEC 9899: 1990 или стандарт ISO / IEC 9899: 1999, и разрешить (но не требовать)
реализации для распознавания шестнадцатеричных целочисленных констант.

Исторические реализации AWK не поддерживает бесконечности с плавающей запятой и NaN в
числовой струны; например, "-INF" и "NaN". Однако реализации, использующие в() или
стртод() функции преобразования получили поддержку этих значений, если они использовали
Стандартная версия функции ISO / IEC 9899: 1999 вместо стандарта ISO / IEC 9899: 1990
версия. По недосмотру редакции этого стандарта с 2001 по 2004 гг.
разрешить поддержку бесконечностей и NaN, но в этой версии поддержка разрешена (но не
обязательный). Это тихое изменение поведения AWK программы; например, в
POSIX locale выражение:

("-INF" + 0 < 0)

раньше имело значение 0, потому что "-INF" преобразован в 0, но теперь он может иметь значение 0 или
1.

БУДУЩЕЕ НАПРАВЛЕНИЯ


Нет.

Используйте awkposix онлайн с помощью сервисов onworks.net



Новейшие онлайн-программы для Linux и Windows