Це команда awkposix, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн емулятор Windows або онлайн емулятор MAC OS
ПРОГРАМА:
ІМ'Я
awk — мова сканування та обробки шаблонів
СИНТАКСИС
awk [−Ф сепструна] [−v призначення]... більшість квитків вже розпродано! [аргумент...]
awk [−Ф сепструна] −f профіль [−f профіль]... [−v призначення]...
[аргумент...]
ОПИС
Команда awk утиліта повинна виконувати програми, написані в awk мова програмування, яка є
спеціалізовані для маніпулювання текстовими даними. An awk програма являє собою послідовність шаблонів і
відповідні дії. Коли читається вхід, який відповідає шаблону, пов’язана дія
з таким візерунком виконується.
Вхідні дані слід інтерпретувати як послідовність записів. За замовчуванням записом є рядок, менше
його припинення , але це можна змінити за допомогою RS вбудована змінна. Кожен
запис введених даних по черзі звіряється з кожним шаблоном у програмі. Для кожного
шаблон відповідний, пов’язана дія повинна бути виконана.
Команда awk Утиліта інтерпретує кожен вхідний запис як послідовність полів, де, by
за замовчуванням поле являє собою рядок не- не- символів. Це за замовчуванням
і роздільник поля можна змінити за допомогою FS вбудована змінна або −Ф
сепструна варіант. awk утиліта позначає перше поле в записі $1, друге
2 долари і так далі. Символ $0 відноситься до всього запису; встановлення будь-якого іншого поля
викликає переоцінку $0. Призначення $0 скидає значення всіх інших полів
і NF вбудована змінна.
ВАРІАНТИ
Команда awk утиліта повинна відповідати тому Base Definitions POSIX.1-2008, розділ
12.2, Утиліта синтаксис керівні вказівки.
Підтримуються такі варіанти:
−Ф сепструна
Визначте роздільник поля введення. Цей варіант має бути еквівалентним:
-v FS =сепструна
крім того, що якщо −Ф сепструна та −v FS =сепструна обидва використовуються, це не уточнено
Чи FS призначення в результаті −Ф сепструна обробляється за командою
рядок або обробляється після останнього −v FS =сепструна. Дивіться опис
в FS вбудовану змінну та те, як вона використовується, у РОЗШИРЕНОМУ ОПИСУ
.
−f профіль
Вкажіть шлях до файлу профіль що містить awk програма. Ім’я шляху
of '−' позначатиме стандартний вхід. Якщо є кілька екземплярів цієї опції
зазначено, конкатенація файлів, зазначених як профіль в порядку
вказується awk програми. The awk Програма також може бути
вказано в командному рядку як один аргумент.
−v призначення
Заявка має гарантувати, що призначення аргумент у тій же формі, що і
an призначення операнд. Зазначене призначення змінної має відбуватися до
виконання awk програми, включаючи дії, пов'язані з ПОЧАТИ моделі
(якщо якийсь). Можна вказати кілька входжень цієї опції.
ОПЕРАНДИ
Підтримуються такі операнди:
більшість квитків вже розпродано! Якщо ні −f вказано опцію, перший операнд до awk має бути текстом
awk програма. Додаток має надати більшість квитків вже розпродано! операнд як єдиний
аргумент до awk. Якщо текст не закінчується на а , awk інтерпретувати
текст, ніби так.
аргумент Будь-який з наступних двох типів аргумент можна змішувати:
файл Шлях до файлу, який містить вхідні дані для читання, тобто
збігається з набором шаблонів у програмі. Якщо ні файл
вказано операнди, або якщо a файл операнд є '−', Стандарт
має використовуватися вхід.
призначення
Операнд, який починається з a або алфавітний символ
з портативного набору символів (див. таблицю в базових визначеннях
том POSIX.1-2008, розділ 6.1, Портативний Характер Установка), слідом
за послідовністю символів підкреслення, цифр і алфавіту з
портативний набір символів, а потім символ '=' символ, вказує a
призначення змінної, а не ім’я шляху. Персонажі перед
'=' представляють ім'я an awk змінний; якщо це ім'я an awk
заповідне слово (див Граматика) поведінка не визначена. Персонажі
слідуючи за повинні тлумачитися так, ніби вони з'явилися
, awk програмі передує подвійні лапки (""")
характер, як а STRING жетон (див Граматика), за винятком того, що якщо останній
символ є неекранованим , це слід тлумачити як a
буквальний а не як перший символ послідовності
"\"". Змінній має бути присвоєно значення цього STRING знак
і, якщо це доречно, розглядається як a числовий рядок (Див.
Вирази in awk), змінній також має бути присвоєно її число
значення. Кожне таке призначення змінної має відбуватися безпосередньо перед
обробка наступного файл, якщо якийсь. Таким чином, завдання перед
перший файл Аргумент виконується після ПОЧАТИ дії (якщо
будь-який), а завдання після останнього файл має відбутися аргумент
перед END дії (якщо такі є). Якщо немає файл аргументи,
призначення повинні виконуватися до обробки стандартного введення.
STDIN
Стандартний вхід повинен використовуватися, лише якщо ні файл вказано операнди, або якщо a файл
операнд є '−', або якщо а профіль параметр-аргумент є '−'; див. розділ ВХІДНІ ФАЙЛИ. Якщо
awk програма не містить дій і шаблонів, але в іншому випадку є дійсною awk програма
стандартний вхід і будь-який файл операнди не читаються і awk виходить із поверненням
нульовий статус.
ВХІД ФАЙЛИ
Вхідні файли до awk програма з будь-якого з наступних джерел має бути текстовими файлами:
* Будь-який файл операндів або їх еквівалентів, досягнутих шляхом модифікації awk змінні ARGV
та ARGC
* Стандартний вхід при відсутності будь-якого файл операнди
* Аргументи до getline функція
Чи змінна RS встановлено значення, відмінне від a чи ні, для цих файлів,
реалізації повинні підтримувати записи, що закінчуються зазначеним роздільником до
{LINE_MAX} байт і може підтримувати довші записи.
If −f профіль зазначено, програма повинна забезпечити, щоб файли, названі кожним з
профіль аргументами параметрів є текстові файли та їх конкатенація в тому ж порядку, що й
вони з'являються в аргументах, є an awk програми.
НАВКОЛИШНЄ СЕРЕДОВИЩЕ ЗМІННІ
Наступні змінні середовища мають впливати на виконання awk:
МОВА Надайте значення за замовчуванням для змінних інтернаціоналізації, які не встановлені або
нуль. (Дивіться том Base Definitions POSIX.1-2008, розділ 8.2,
Internationalization Змінні за пріоритет інтернаціоналізації
змінні, що використовуються для визначення значень категорій мовного стандарту.)
LC_ALL Якщо встановлено не порожнє значення рядка, замініть значення всіх інших
змінні інтернаціоналізації.
LC_COLLATE
Визначте місцевість для поведінки діапазонів, класів еквівалентності та мульти-
елементи порівняння символів у регулярних виразах і в порівняннях
рядкові значення.
LC_CTYPE Визначте локаль для інтерпретації послідовностей байтів текстових даних
як символи (наприклад, однобайтові на відміну від багатобайтових символів у
аргументи та вхідні файли), поведінку класів символів у звичайних
вирази, ідентифікація символів як букв і відображення
символи верхнього та нижнього регістрів для топпер та знизити функції.
LC_MESSAGES
Визначте місцевий стандарт, який слід використовувати для впливу на формат і вміст
діагностичні повідомлення, записані у стандартну помилку.
LC_NUMERIC
Визначте основний символ, який використовується під час інтерпретації числового введення, виконання
перетворення між числовими і рядковими значеннями, а також форматування числового виводу.
Незалежно від місцевості, символ (знак десяткової коми
Локаль POSIX) — це десятковий символ, який розпізнається під час обробки awk
програми (включаючи призначення в аргументах командного рядка).
NLSPATH Визначте розташування каталогів повідомлень для обробки LC_MESSAGES.
PATH Визначте шлях пошуку під час пошуку команд, які виконуються система(експр), або
вхідні та вихідні труби; див. том Base Definitions POSIX.1-2008, Глава
8, Навколишнє середовище Змінні.
Крім того, всі змінні середовища повинні бути видимі через awk змінна СЕРЕДОВИЩЕ.
АСИНХРОННИЙ ПОДІЇ
За замовчуванням.
ВИСТАВКА
Характер вихідних файлів залежить від awk програми.
STDERR
Стандартна помилка повинна використовуватися лише для діагностичних повідомлень.
ВИХІД ФАЙЛИ
Характер вихідних файлів залежить від awk програми.
ПОВЕРНЕНІ ОПИС
Загальний програма Структура
An awk Програма складається з пар виду:
модель { дію }
Можуть бути або шаблон, або дія (включаючи символи, що охоплюють дужки).
пропущено.
Відсутній шаблон повинен відповідати будь-якому запису введення, а пропущена дія має відповідати
дорівнює:
{ друк }
Виконання awk програма повинна починатися з виконання дій, пов’язаних з
всі ПОЧАТИ шаблони в порядку, в якому вони зустрічаються в програмі. Потім кожен файл операнд (або
стандартне введення, якщо файли не вказано) повинні оброблятися по черзі шляхом зчитування даних з
файл, доки не з’явиться роздільник записів ( за замовчуванням). Перед першим
оцінюється посилання на поле в записі, запис має бути розбитий на поля,
згідно з правилами в регулярний Вирази, використовуючи значення FS що було поточним на
час читання запису. Кожний шаблон у програмі потім оцінюється в
порядок появи та дію, пов’язану з кожним шаблоном, який відповідає поточному
запис виконано. Дія для шаблону відповідності має бути виконана перед оцінкою
наступні візерунки. Нарешті, дії, пов'язані з усіма END візерунки повинні бути
виконуються в тому порядку, в якому вони зустрічаються в програмі.
Вирази in awk
Вирази описують обчислення, які використовуються в моделі та дії. У наступній таблиці
дійсні операції виразу надаються групами від найвищого пріоритету до найнижчого
пріоритет останній, з операторами рівного пріоритету, згрупованими між горизонтальними рядками. в
оцінка виразу, де граматика формально неоднозначна, вищий пріоритет
Оператори повинні оцінюватися перед операторами з нижчим пріоритетом. У цій таблиці експр, вираз 1,
вираз 2 та вираз 3 представляють будь-який вираз, тоді як lvalue представляє будь-яку сутність, яка може бути
присвоєно (тобто зліва від оператора присвоєння). Точний синтаксис
вирази подано в Граматика.
таблиця 4-1: Вирази in Зниження Пріоритет in awk
┌─────────────────────┬─────────────────────────┬─ ───────────────┬───────────────┐
│ синтаксис │ ІМ'Я │ тип of Результат │Асоціативність │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│( експр ) │Групування │Тип експр │Н/Д │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│$експр │Полеове посилання │Рядок │Н/Д │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│lvalue ++ │Після збільшення │Числове │N/A │
│lvalue −− │Після декременту │Числовий │N/A │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│++ значення │Попереднє збільшення │Числове │Н/Д │
│−− lзначення │Попереднє декремент │Числове │Н/Д │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр ^ експр │Подведення до степеня │Числове │Праворуч │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│! експр │Логічні не │Числові │Н/Д │
│+ експр │Унарний плюс │Числовий │Н/Д │
│− експр │Унарний мінус │Числовий │Н/Д │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр * експр │Множення │Числове │ліворуч │
│експр / експр │Ділення │Числове │ліворуч │
│експр % експр │Модуль │Числовий │Лівий │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр + експр │Додаток │Числовий │Лівий │
│експр - експр │Віднімання │Числове │ліворуч │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр експр │Конкатенація рядків │Рядок │Ліва │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр < експр │Менше │Числовий │Немає │
│експр <= експр │Менше або дорівнює │Числовий │Немає │
│експр != експр │Не дорівнює │Числовий │Немає │
│експр == експр │Дорівнює │Числовому │Немає │
│експр > експр │Більше │Числового │Немає │
│експр >= експр │Більше або дорівнює │Числовий │Немає │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр ~ експр │РЕ збіг │Числовий │Немає │
│експр !~ експр │ERE не відповідає │Числовий │Немає │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр в масиві │Членство в масиві │Числове │ліворуч │
│( індекс в) масив │Багатовимірний масив │Числовий │Лівий │
│ │членство │ │ │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр && експр │Логічні І │Числові │Ліва │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│експр || експр │Логічний АБО │Числовий │Лівий │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│вираз 1 ? вираз 2 : вираз 3│Умовний вираз │Тип виділеного│Праворуч │
│ │ │вираз 2 or вираз 3 │ │
├─────────────────────┼─────────────────────────┼─ ───────────────┼───────────────┤
│lзначення ^= експр │Призначення в степені│Числове │Праворуч │
│lзначення %= експр │Призначення модуля │Числове │Праворуч │
│lзначення *= експр │Завдання множення│Числове │Праворуч │
│lзначення /= експр │Призначення ділення │Числове │Праворуч │
│lзначення += експр │Призначення додавання │Числове │Праворуч │
│lзначення −= експр │Призначення віднімання │Числове │Праворуч │
│lзначення = експр │Призначення │Тип експр │Праворуч │
└─────────────────────┴─────────────────────────┴─ ───────────────┴───────────────┘
Кожен вираз має мати або рядкове значення, чи числове значення, або обидва. Крім як
зазначене для конкретних контекстів, значення виразу має бути неявно перетворено в
тип, необхідний для контексту, в якому він використовується. Значення рядка має бути перетворено в
числове значення або еквівалентом наступних викликів функцій, визначених за допомогою
стандарт ISO C:
setlocale(LC_NUMERIC, "");
числове_значення = atof(рядкове_значення);
або шляхом перетворення початкової частини рядка в тип подвійний представлення як
наступним чином:
Вхідний рядок розбивається на дві частини: початкову, можливо, порожню послідовність
пробілів (як зазначено в єпростір()) і послідовність теми
інтерпретується як константа з плаваючою комою.
Очікувана форма предметної послідовності є необов’язковою '+' or '−' знак, потім а
непорожня послідовність цифр, що містить а , потім необов’язковий
показникова частина. Показникова частина складається з 'е' or 'E', а потім необов’язковий
знак, за яким слідують одна або кілька десяткових цифр.
Послідовність, яка починається з першої цифри або цифри (що настане раніше)
інтерпретується як плаваюча константа мови C, а якщо ні, ні показник
частина ні а з'являється, а передбачається, що слідує за останньою цифрою в
рядок. Якщо предметна послідовність починається зі знака мінус, значення, отримане з
перетворення заперечується.
Числове значення, яке точно дорівнює значенню цілого числа (див розділ 1.1.2,
Поняття Отриманий від ISO C стандарт) має бути перетворено в рядок еквівалентом
дзвінка до спринт функцію (див рядок Функції) зі шнурком "%d" в якості fmt
аргумент і числове значення перетворюються як перше і єдине експр аргумент. Будь-який
інше числове значення має бути перетворено в рядок за допомогою еквіваленту виклику
спринт функція зі значенням змінної CONVFMT в якості fmt аргумент і
числове значення, яке перетворюється як перше і єдине експр аргумент. Результат
перетворення не вказано, якщо значення CONVFMT не є форматом з плаваючою комою
специфікація. Цей том POSIX.1-2008 не визначає явних перетворень між ними
числа та рядки. Додаток може примусово розглядати вираз як число
додаючи до нього нуль, або можна змусити його розглядати як рядок, об’єднавши нуль
рядок ("") до нього.
Рядковим значенням вважається a числовий рядок якщо воно походить від одного з наступного:
1. Змінні поля
2. Вхідні дані з getline() функція
3. ФІЛЕНАМ
4. ARGV елементи масиву
5. СЕРЕДОВИЩЕ елементи масиву
6. Елементи масиву, створені за допомогою розкол() функція
7. Призначення змінної командного рядка
8. Призначення змінної з іншої числової рядкової змінної
і залежна від реалізації умова, що відповідає будь-якому випадку (a) або (b) нижче
зустрілися.
а. Після еквіваленту наведених нижче викликів функцій, визначених ISO C
стандарт, string_value_end відрізнявся б від рядкове_значення, а також будь-які символи раніше
кінцевий нульовий символ в string_value_end був би символи:
бак *string_value_end;
setlocale(LC_NUMERIC, "");
числове_значення = strtod (рядкове_значення, &string_value_end);
б. Після застосування всіх наступних перетворень отриманий рядок буде
лексично визнаватися як a НОМЕР лексема, як описано в лексичних конвенціях в
Граматика:
-- Усі провідні та задові символи відкидаються.
-- Якщо перший не- є '+' or '−', його відкидають.
-- Кожне поява десяткового знака з поточної локалі змінюється
до а .
У випадку (а) числове значення числовий рядок має бути значенням, яке було б
повернуто strtod() дзвінок. У випадку (b), якщо перший не- є '−', числові
значення числовий рядок має бути запереченням числового значення розпізнаного
НОМЕР токен; інакше числове значення числовий рядок має бути числовим
значення визна НОМЕР токен. Незалежно від того, чи є рядок a числовий рядок має бути
актуальні лише в контекстах, де цей термін використовується в цьому розділі.
Коли вираз використовується в булевому контексті, якщо він має числове значення, значення
нуль буде вважатися хибним, а будь-яке інше значення буде вважатися істинним. В іншому випадку а
рядкове значення нульового рядка розглядатиметься як хибне, а будь-яке інше значення має вважатися
трактується як істина. Логічний контекст має бути одним із наступних:
* Перший підвираз умовного виразу
* Вираз, який оперує логічним НЕ, логічним І або логічним АБО
* Другий вираз а та цінності заяву
* Вираз an 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 оцінюється лише один раз.
Змінні та поля встановлюються оператором присвоєння:
значення = вираз
і тип вираз має визначити результуючий тип змінної. Завдання
включає арифметичні завдання ("+=", "−=", "*=", "/=", "%=", "^=", "++", "−−") всі
з яких дає числовий результат. Ліва частина завдання та
Метою операторів інкременту та декременту може бути одна із змінних, масив з індексом,
або селектор поля.
Команда awk мова надає масиви, які використовуються для зберігання чисел або рядків. Масиви
оголошувати не потрібно. Спочатку вони повинні бути порожніми, а їх розміри змінюються
динамічно. Індекси, або ідентифікатори елементів, є рядками, що надають тип
можливість асоціативного масиву. Ім’я масиву з індексом у квадратних дужках
може використовуватися як значення l і, таким чином, як вираз, як описано в граматиці; побачити
Граматика. Імена масивів без передплати можна використовувати лише в таких контекстах:
* Параметр у визначенні функції або виклику функції
* ІМ'Я маркер після будь-якого використання ключового слова in як зазначено в граматиці (див
Граматика); якщо ім'я, використане в цьому контексті, не є ім'ям масиву, поведінка є
невизначених
Допустимий масив індекс має складатися з одного або кількох -відокремлені вирази, подібні до
спосіб індексації багатовимірних масивів у деяких мовах програмування.
Тому що awk масиви дійсно одновимірні, наприклад -відокремлений список
перетворюється в один рядок шляхом конкатенації рядкових значень окремого
вирази, кожен відокремлений значенням СУБСЕП змінний. Таким чином,
наступні дві індексні операції мають бути еквівалентними:
було[вираз 1, вираз 2, ... вираз]
було[вираз 1 СУБСЕП вираз 2 ПІДСЕП ... ПІДСЕП вираз]
Додаток має забезпечити багатовимірність індекс використовується з in оператор є
в дужках. The in оператор, який перевіряє наявність певного масиву
елемент, не спричиняє існування цього елемента. Будь-яке інше посилання на неіснуючий масив
елемент повинен автоматично створити його.
Порівняння (з '<', "<=", "!=", "==", '>' та ">=" операторів).
чисельно, якщо обидва операнди числові, якщо один є числовим, а інший має рядок
значення, яке є числовим рядком, або якщо один є числовим, а інший має неініціалізований
значення. В іншому випадку операнди повинні бути перетворені в рядки, як потрібно, і в рядок
порівняння має бути зроблено з використанням послідовності зіставлення, що залежить від локалі. Значення
вираз порівняння має бути 1, якщо відношення істинне, або 0, якщо відношення хибне.
Змінні та спеціальний Змінні
Змінні можна використовувати в awk програму, посилаючись на них. За винятком
параметри функції (див Визначений користувачем Функції), вони не оголошуються явно.
Назви параметрів функції мають бути локальними для функції; всі інші імена змінних мають бути
глобальний. Одне й те саме ім’я не можна використовувати як ім’я параметра функції та як ім’я
функції чи спец awk змінний. Одна й та сама назва не може використовуватися як a
ім'я змінної з глобальною областю дії та як ім'я функції. Такого ж імені бути не повинно
використовується в одній області і як скалярна змінна, і як масив. Неініціалізований
змінні, включаючи скалярні змінні, елементи масиву та змінні поля, повинні мати an
неініціалізоване значення. Неініціалізоване значення має мати як числове значення нуль, так і а
рядкове значення порожнього рядка. Визначення змінних з неініціалізованим значенням, до
рядкові або числові, визначаються контекстом, у якому вони використовуються.
Змінні поля позначаються символом a '$' за яким слідує число або числовий вираз.
Вплив номера поля вираз оцінка на будь-що інше, ніж невід’ємна
ціле число не вказано; не потрібно перетворювати в неініціалізовані змінні або рядкові значення
числові значення в цьому контексті. Нові змінні поля можна створити, призначивши значення
їх. Посилання на неіснуючі поля (тобто поля після $NF), оцінюється до
неініціалізоване значення. Такі посилання не створюють нових полів. Однак приписуючи а
неіснуюче поле (наприклад, $(NF+2)=5) збільшити значення NF; створити будь-який
проміжні поля з неініціалізованим значенням; і призведе до значення $0
повторно обчислено, при цьому поля розділяються значенням ОФС. Кожна змінна поля
під час створення має мати рядкове значення або неініціалізоване значення. Змінні поля повинні
мають неініціалізоване значення при створенні з $0 за допомогою FS а змінна ні
містять будь-які символи. Якщо доречно, змінна поля вважається числовою
рядок (див Вирази in awk).
Реалізації повинні підтримувати наступні інші спеціальні змінні, які встановлюються awk:
ARGC Кількість елементів у ARGV масив.
ARGV Масив аргументів командного рядка, за винятком параметрів і параметрів більшість квитків вже розпродано! аргумент,
пронумеровані від нуля до ARGC–1.
Аргументи в ARGV можна змінити або додати; ARGC можна змінити. Як кожен
вхідний файл закінчується, awk розглядатиме наступний ненульовий елемент ARGV, аж до
поточне значення ARGC−1 включно як ім’я наступного вхідного файлу. таким чином,
встановлення елемента ARGV значення null означає, що воно не повинно розглядатися як an
вхідний файл. Ім'я '−' вказує стандартний вхід. Якщо аргумент збігається
формат an призначення операнд, цей аргумент буде розглядатися як
призначення а не а файл аргумент.
CONVFMT Команда printf формат для перетворення чисел у рядки (крім вихідних
заяви, де OFMT використовується); "%.6g" за замовчуванням
СЕРЕДОВИЩЕ Масив, що представляє значення середовища, як описано в Exec
функції, визначені в томі системних інтерфейсів POSIX.1‐2008. Індекси
масиву мають бути рядки, що складаються з імен середовища
змінних, а значення кожного елемента масиву має бути рядком, що складається з
значення цієї змінної. Якщо доречно, змінна середовища має бути
вважається a числовий рядок (Див. Вирази in awk); елемент масиву повинен
також мають своє числове значення.
У всіх випадках, коли поведінка о awk на нього впливають змінні середовища
(включаючи середовище будь-яких команд, які awk виконується через система
або через перенаправлення конвеєра за допомогою друк заява, printf
заяву, або getline функція), використовуваним середовищем має бути
оточення того часу awk розпочав виконання; він визначається реалізацією
будь-які модифікації СЕРЕДОВИЩЕ впливає на це середовище.
ФІЛЕНАМ Шлях до поточного вхідного файлу. Всередині а ПОЧАТИ дія це значення
невизначений. Всередині а END дія значення має бути ім'ям останнього введення
файл оброблено.
ФНР Порядковий номер поточного запису в поточному файлі. Всередині а ПОЧАТИ
дії значення має дорівнювати нулю. Всередині а END дія значення має бути
номер останнього обробленого запису в останньому обробленому файлі.
FS Регулярний вираз роздільника поля введення; а за замовчуванням.
NF Кількість полів у поточному записі. Всередині а ПОЧАТИ дії, використання NF
не визначено, якщо a getline функція без а було виконується аргумент
раніше. Всередині а END дії, NF збереже ту цінність, яку вона мала останнім часом
читання запису, якщо не буде перенаправлено наступне, getline функція без а було
аргумент виконується перед введенням END дії.
NR Порядковий номер поточного запису від початку введення. Всередині а
ПОЧАТИ дії значення має дорівнювати нулю. Всередині а END значення має бути
номер останнього обробленого запису.
OFMT Команда printf формат для перетворення чисел у рядки у вихідних операторах (див
Вихід Заяви); "%.6g" за замовчуванням. Результатом перетворення є
невизначено, якщо значення OFMT не є специфікацією формату з плаваючою комою.
ОФС Команда друк роздільник поля виводу оператора; за замовчуванням.
ОРС Команда друк роздільник запису виводу оператора; а за замовчуванням.
ДОВЖИНА Довжина рядка відповідає параметру матч функції.
RS Перший символ рядкового значення RS має бути вхідним записом
сепаратор; а за замовчуванням. Якщо RS містить більше одного символу,
результати не уточнені. Якщо RS має значення null, то записи розділяються послідовностями
що складається з а плюс один або кілька порожніх рядків на початку або в кінці
порожні рядки не повинні призводити до порожніх записів на початку або в кінці
введення, а завжди буде роздільником полів, незважаючи на те, що
Значення FS є.
RSTART Початкова позиція рядка, що відповідає матч функція, нумерація
від 1. Це завжди має бути еквівалентним поверненому значенню матч
функції.
СУБСЕП Рядок роздільника індексу для багатовимірних масивів; значення за замовчуванням
визначається реалізацією.
регулярний Вирази
Команда awk Утиліта має використовувати розширену нотацію регулярного виразу (див. Base
Том визначень POSIX.1-2008, розділ 9.4, Розширений регулярний Вирази) крім цього
він повинен дозволяти використання конвенцій мови C для екранування спеціальних символів всередині
ERE, як зазначено в таблиці в томі базових визначень POSIX.1-2008,
Глава 5, Файл сформований нотація ('\\', '\a', '\b', '\ f', '\ n', '\ r', '\ t', '\ v') І
наступна таблиця; ці вихідні послідовності повинні розпізнаватися як всередині, так і зовні
вирази в дужках. Зауважте, що записи не потрібно розділяти за допомогою персонажів і
рядкові константи можуть містити персонажів, тож навіть "\n" послідовність дійсна в
awk EREs. Використання a символ у ERE вимагає екранування, показаного в
наступну таблицю.
таблиця 4-2: Бігти Послідовності in awk
┌─────────┬─────────────────────────────────────┬── ───────────────────────────────────┐
│ Бігти │ │ │
│Послідовність │ Опис │ Сенс │
├──────────┼─────────────────────────────────────┼── ───────────────────────────────────┤
│\" │ │ характер │
├──────────┼─────────────────────────────────────┼── ───────────────────────────────────┤
│\/ │ │ характер │
├──────────┼─────────────────────────────────────┼── ───────────────────────────────────┤
│\ddd │ А після символу │ Символ, кодування якого │
│ │ найдовшою послідовністю одиниці, │ представленою одиницею, двома або │
│ │ дво- або три вісімкове число │ тризначне вісімкове ціле число. Багато- │
│ │ символи (01234567). Якщо для всіх │ байтових символів потрібно кілька, │
│ │ цифри 0 (тобто │ з’єднані escape-послідовності │
│ │ представлення NUL │ цього типу, включаючи провідні │
│ │ характер), поведінка │ для кожного байта. │
│ │ невизначено. │ │
├──────────┼─────────────────────────────────────┼── ───────────────────────────────────┤
│\c │ А символ слідує │ Невизначений │
│ │ будь-яким символом, не описаним у │ │
│ │ цієї таблиці або в таблиці в │ │
│ │ Базові визначення обсягу │ │
│ │ POSIX.1-2008, Глава 5, Файл │ │
│ │ сформований нотація ('\\', '\a', '\b', │ │
│ │ '\ f', '\ n', '\ r', '\ t', '\ v'). │ │
└─────────┴─────────────────────────────────────┴── ───────────────────────────────────┘
Регулярний вираз можна зіставити з певним полем або рядком за допомогою одного з
два оператори відповідності регулярних виразів, '~' та "!~". Ці оператори повинні інтерпретувати
їхній правий операнд як регулярний вираз, а лівий операнд як рядок.
Якщо регулярний вираз відповідає рядку, то '~' вираз має оцінюватися до значення
з 1 і "!~" Вираз має отримати значення 0. (Регулярний вираз
операція збігу визначена терміном, відповідним у томі базових визначень
POSIX.1-2008, розділ 9.1, регулярний вираз Визначення, де збіг відбувається на будь-якому
частина рядка, якщо регулярний вираз не обмежено або
спеціальні символи.) Якщо регулярний вираз не відповідає рядку,
'~' вираз має оцінюватися до значення 0, а значення "!~" вираз має оцінюватися
до значення 1. Якщо правий операнд є будь-яким виразом, відмінним від лексичної лексеми
ЕРЕ, рядкове значення виразу інтерпретується як розширений регулярний
вираз, включаючи описані вище конвенції. Зверніть увагу, що ці самі втечі
Умови також повинні застосовуватися при визначенні значення рядкового літералу (the
лексична лексема STRING), і, таким чином, має застосовуватися вдруге, коли є рядковий литерал
використовується в цьому контексті.
Коли ЕРЕ лексема з’являється як вираз у будь-якому контексті, крім правої руки
'~' or "!~" або як один із вбудованих аргументів функції, описаних нижче, the
значення результуючого виразу має бути еквівалентним:
$0 " " /знаходяться/
Команда знаходяться аргумент до gsub, матч, нижче функції та fs аргумент до розкол
функцію (див рядок Функції) слід інтерпретувати як розширені регулярні вирази.
Це можуть бути будь-які ЕРЕ лексеми або довільні вирази, і повинні інтерпретуватися в
так само, як і права сторона '~' or "!~" оператор.
Розширений регулярний вираз можна використовувати для розділення полів шляхом призначення рядка
містить вираз до вбудованої змінної FS, безпосередньо або як наслідок
використання −Ф сепструна варіант. Значення за замовчуванням FS змінна повинна бути одиничною
. Нижче описано FS поведінка:
1 Якщо FS є нульовим рядком, поведінка не визначена.
2 Якщо FS є одним символом:
а. Якщо FS є , пропускати провідний і кінцевий і символи;
поля повинні бути розмежовані наборами з одного або кількох або символів.
б. Інакше, якщо FS це будь-який інший символ c, поля мають бути розмежовані кожне
одноразове виникнення c.
3. В іншому випадку рядкове значення FS вважається продовженим черговим
вираз. Кожне входження послідовності відповідає розширеному регулярному виразу
розмежувати поля.
За винятком '~' та "!~" операторів, а в gsub, матч, розкол та нижче вбудований
функції, узгодження ERE повинно базуватися на вхідних записах; тобто роздільник записів
символів (перший символ значення змінної RS, за замовчуванням)
не може бути вбудований у вираз, і жоден вираз не повинен відповідати роздільнику запису
характер. Якщо роздільника записів немає , символи, вбудовані в
вираз можна зіставити. Для '~' та "!~" операторів, а в цих чотирьох вбуд
функції, відповідність ERE має базуватися на текстових рядках; тобто будь-який символ (в т.ч
і роздільник записів) може бути вбудований у шаблон і відповідний
шаблон повинен відповідати будь-якому символу. Однак у всьому awk ERE відповідність, використання одного або
більше NUL-символів у шаблоні, вхідному записі або текстовому рядку створює undefined
результати.
Шаблони
A модель будь-який дійсний вираз, діапазон, визначений двома виразами, розділеними символом a
кома або один із двох спеціальних шаблонів ПОЧАТИ or END.
спеціальний Шаблони
Команда awk утиліта повинна розпізнавати два спеціальні шаблони, ПОЧАТИ та END. Кожен ПОЧАТИ модель
має бути зіставлено один раз, і пов’язана з ним дія виконується до першого запису введення
читається — за винятком, можливо, використанням getline функцію (див Введення-виведення та Загальне
Функції) у попередньому ПОЧАТИ дії — і до того, як буде виконано призначення командного рядка. Кожен END
шаблон повинен бути збіганий один раз, а пов’язана з ним дія виконується після останнього запису
вхід прочитано. Ці два шаблони повинні мати пов’язані дії.
ПОЧАТИ та END не поєднується з іншими візерунками. Кілька ПОЧАТИ та END візерунки повинні
допускається. Дії, пов’язані з ПОЧАТИ викрійки виконуються в порядку
зазначені в програмі, як і END дії. An END візерунок може передувати a ПОЧАТИ
шаблон у програмі.
Якщо awk Програма складається тільки з дій з шаблоном ПОЧАТИ, А ПОЧАТИ дію
не містить getline функція awk має вийти, не зчитуючи свій вхід, коли останній
заява в останньому ПОЧАТИ дія виконується. Якщо an awk Програма складається тільки з дій
з малюнком END або тільки дії з візерунками ПОЧАТИ та END, вхід має бути
прочитати перед твердженнями в END виконуються дії.
вираз Шаблони
Шаблон виразу оцінюється так, як якщо б він був виразом у булевому контексті.
Якщо результат істинний, шаблон вважається відповідним і пов’язана з ним дія
(якщо є) виконується. Якщо результат хибний, дія не виконується.
Викрійки Діапазони
Діапазон шаблонів складається з двох виразів, розділених комою; в даному випадку дія
виконується для всіх записів між збігом першого виразу та
наступне відповідність другого виразу включно. У цей момент діапазон шаблону може
повторюватися, починаючи з вхідних записів після кінця відповідного діапазону.
Дії
Дія - це послідовність висловлювань, як показано в граматиці в Граматика. Будь-який сингл
оператор може бути замінений списком операторів, укладеним у фігурні дужки. Додаток
повинен забезпечити, щоб заяви у списку заяв розділялися символами або
символів. Записи в списку заяв виконуються послідовно в порядку
що вони з'являються.
Команда вираз виступаючи в якості умовного в an if заява оцінюється і якщо вона
відмінний від нуля або не нульовий, слід виконати наступний оператор; інакше, якщо ще is
теперішній, заява після ще підлягає виконанню.
Команда if, в той час як, do...в той час як, та цінності, перерву та продовжувати твердження засновані на ISO C
стандарт (див розділ 1.1.2, Поняття Отриманий від ISO C стандарт), за винятком того, що
Логічні вирази повинні розглядатися, як описано в Вирази in awk, і крім в
випадок:
та цінності (змінна in масив)
які повинні повторюватися, призначаючи кожному індекс of масив до змінна у невизначеному порядку.
Результати додавання нових елементів до масив в межах такого та цінності цикл не визначено. Якщо
перерву or продовжувати оператор відбувається поза циклом, поведінка не визначена.
Команда видаляти оператор має видалити окремий елемент масиву. Таким чином, наступний код
видаляє весь масив:
та цінності (індекс in масив)
видаляти масив [індекс]
Команда наступний оператор повинен спричинити всю подальшу обробку поточного вхідного запису
покинутий. Поведінка невизначена, якщо a наступний оператор з'являється або викликається в a ПОЧАТИ
or END дії.
Команда вихід заява має викликати всі END дії в тому порядку, в якому вони відбуваються в
джерело програми, а потім завершити програму, не читаючи подальшого введення. An вихід
заява всередині an END дія повинна припинити програму без подальшого виконання
END дії. Якщо вираз вказано в an вихід твердження, його числове значення має
бути статусом виходу awk, якщо не буде виявлено наступних помилок або наступних вихід
виконується оператор з виразом.
Вихід Заяви
обидві друк та printf За замовчуванням оператори повинні записуватись у стандартний вихід. Вихід
виписується за місцем, визначеним вихід_переспрямування якщо такий надається, як
наступним чином:
> вираз
>> вираз
| вираз
У всіх випадках, вираз має бути оцінений для отримання рядка, який використовується як a
ім'я шляху, до якого потрібно писати (for '>' or ">>") або як команда для виконання (для '|').
Використовуючи перші дві форми, якщо файл з такою назвою зараз не відкритий, він має бути відкритим
відкрито, створивши його, якщо необхідно, та використавши першу форму, обрізавши файл. Вихід
потім додається до файлу. Поки файл залишається відкритим, наступні виклики
який вираз оцінює те саме рядкове значення, просто додає вихід до
файл. Файл залишається відкритим до близько функцію (див Введення-виведення та Загальне
Функції) викликається з виразом, який обчислює те саме значення рядка.
Третя форма повинна записувати вихідні дані в потік, що передається на вхід команди. The
потік створюється, якщо на даний момент не відкрито жодного потоку зі значенням вираз як її
ім'я команди. Створений потік має бути еквівалентним потоку, створеному викликом до
попен() функція, визначена в томі системних інтерфейсів POSIX.1‐2008 зі значенням
вираз в якості команда аргумент і значення w в якості режим аргумент. Поки
потік залишається відкритим, наступні виклики в якому вираз оцінюється до того самого рядка
value має записати вихід в існуючий потік. Потік залишається відкритим до
близько функцію (див Введення-виведення та Загальне Функції) викликається виразом that
оцінює те саме значення рядка. У цей час потік повинен бути закритий як би а
дзвонити до pcclose() функція, визначена в томі системних інтерфейсів POSIX.1-2008.
Як детально описано в граматиці в Граматика, ці вихідні оператори повинні приймати a
-окремий список виразs, на які в граматиці посилається нетермінал
Символи список виразів, print_expr_listабо print_expr_list_opt. Цей список посилається тут
в якості вираз список, і кожен член позначається як вираз аргумент.
Команда друк оператор повинен записати значення кожного аргументу виразу на вказаний
вихідний потік, розділений роздільником поточного вихідного поля (див. змінну ОФС вище),
і закінчується роздільником вихідних записів (див. змінну ОРС вище). Все вираження
аргументи приймаються як рядки, при необхідності перетворюються; це перетворення
бути таким, як описано в Вирази in awk, за винятком того, що printf форматувати в OFMT
використовується замість значення в CONVFMT. Порожній список виразів означає
весь вхідний запис ($0).
Команда printf оператор повинен виводити вихідні дані на основі позначень, подібних до формату файлу
Позначення, що використовуються для опису форматів файлів у цьому томі POSIX.1-2008 (див.
Том визначень POSIX.1-2008, Глава 5, Файл сформований нотація). Вихід має бути
виготовлено, як зазначено з першим вираз аргумент як рядок формат та
наступні вираз аргументи як рядки arg1 до арг, включно, з наступним
винятки:
1. формат має бути фактичним рядком символів, а не графічним представленням.
Тому він не може містити порожні позиції символів. The в формат
рядок у будь-якому контексті, крім a прапор специфікації перетворення, має бути
розглядається як звичайний символ, який копіюється на вихід.
2. Якщо набір символів містить a '' і цей символ з'являється в формат
рядка, він повинен розглядатися як звичайний символ, який копіюється у вихідні дані.
3. бігти послідовності починаючи з а символ слід розглядати як
послідовності звичайних символів, які копіюються на вихід. Зверніть увагу, що ці ж
послідовності повинні інтерпретуватися лексично за допомогою awk коли вони з'являються у літерних рядках,
але вони не повинні оброблятися спеціально printf Заява
4. поле ширина or точність можна вказати як '*' символ замість цифри
рядок. У цьому випадку витягується наступний аргумент зі списку виразів і
його числове значення приймається як ширина або точність поля.
5. Реалізація не повинна передувати чи слідувати за результатами d or u Перетворення
специфікаційні символи з символи, не зазначені в формат рядок.
6. Реалізація не повинна передувати виходу з o символ специфікатора перетворення
з провідними нулями, не визначеними формат рядок.
7 Для c Символ специфікатора перетворення: якщо аргумент має числове значення, то
має бути виведений символ, кодування якого є цим значенням. Якщо значення дорівнює нулю чи ні
кодування будь-якого символу в наборі символів, поведінка не визначена. Якщо
аргумент не має числового значення, перший символ рядкового значення має
бути вихідним; якщо рядок не містить символів, поведінка не визначена.
8. Для кожної специфікації перетворення, яка споживає аргумент, наступний вираз
аргумент має бути оцінений. За винятком c специфікатор перетворення
символ, значення має бути перетворено (згідно з правилами, зазначеними в
Вирази in awk) до відповідного типу для специфікації перетворення.
9. Якщо аргументів виразу недостатньо для виконання всього перетворення
специфікації в формат рядок, поведінка не визначена.
10. Якщо будь-яка послідовність символів у формат рядок починається з a '%' характер, але робить
не формують дійсну специфікацію перетворення, поведінка не визначена.
обидві друк та printf може вивести щонайменше {LINE_MAX} байт.
Функції
Команда awk мова має різноманітні вбудовані функції: арифметичні, рядкові, введення/виведення,
і загальний.
Арифметика Функції
Арифметичні функції, крім Int, повинні базуватися на стандарті ISO C (див
розділ 1.1.2, Поняття Отриманий від ISO C стандарт). Поведінка не визначена в
випадки, коли стандарт ISO C визначає, що повертається помилка або поведінка є
невизначений. Хоча граматика (див Граматика) дозволяє вбудованим функціям відображатися без
аргументи або дужки, якщо аргумент або дужки не вказані як необов’язкові в
наведений нижче список (відображаючи їх усередині "[]" дужки), таке використання не визначено.
атан2(y,x)
Повернути арктангенс y/x в радіанах у діапазоні [−π,π].
ство(x) Косинус повернення x, Де x знаходиться в радіанах.
гріх(x) Синус повернення x, Де x знаходиться в радіанах.
ехр(x) Повернути показникову функцію x.
журнал(x) Поверніть натуральний логарифм x.
кв(x) Повернути квадратний корінь з x.
Int(x) Повертає аргумент, усічений до цілого числа. Зрізання має бути до 0, коли
x> 0 рік.
рядок() Повернути випадкове число n, такий, що 0≤n
сранд([експр])
Встановіть початкове значення для рядок до експр або використовувати час доби, якщо експр опускається.
Попереднє початкове значення має бути повернуто.
рядок Функції
Рядкові функції в наведеному нижче списку повинні підтримуватися. Хоча граматика (див
Граматика) дозволяє вбудованим функціям з’являтися без аргументів або дужок, за винятком випадків
аргумент або дужки вказуються як необов’язкові в наступному списку (відображенням
їх у межах "[]" дужки), таке використання не визначено.
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, Всі
елементи масиву повинні бути видалені перед виконанням розбиття. The
розділення повинно здійснюватися з ERE fs або з роздільником полів FS if fs is
не дано. Кожен елемент масиву повинен мати рядкове значення під час створення і якщо
відповідно, елемент масиву вважається числовим рядком (див
Вирази in awk). Ефект нульового рядка як значення fs is
невизначений.
спринт(fmt, експр, експр, ...)
Відформатуйте вирази відповідно до printf формат, заданий fmt і повернутися
отриманий рядок.
під(знаходяться, репл[, in ])
Підставте рядок репл замість першої інстанції розширеної
регулярне вираження ЕРЕ в рядку in і повернути кількість замін. An
('&'), що з’являється в рядку репл буде замінено рядком
від in що відповідає ERE. An передує а буде
трактуватися як буквальне характер. Поява двох
послідовний символи повинні інтерпретуватися лише як один літерал
характер. Будь-яке інше виникнення a (наприклад,
перед будь-яким іншим символом) слід розглядати як буквальний
характер. Зверніть увагу, що якщо репл є рядковим літералом (лексична лексема STRING; подивитися
Граматика), поводження з характер виникає після будь-якого лексичного
обробки, в тому числі будь-якої лексичної -обробка вихідної послідовності. Якщо in
вказано і не є значенням l (див Вирази in awk), поведінка є
невизначений. Якщо in пропущено, awk використовувати поточний запис ($0) замість нього.
субстр(s, m[, n ])
Повернути щонайбільше n- символьний підрядок s що починається з положення m,
нумерація від 1. Якщо n опущено, або якщо n вказує більше символів, ніж є
залишеного в рядку, довжина підрядка має бути обмежена довжиною
рядка s.
знизити(s)
Повернути рядок на основі рядка s. Кожен персонаж у s це велика літера
лист із зазначенням а знизити відображення за LC_CTYPE категорія
поточна мова має бути замінена у поверненому рядку на малу літеру
визначені відображенням. Інші персонажі в s буде незмінним у
повернутий рядок.
топпер(s)
Повернути рядок на основі рядка s. Кожен персонаж у s це нижній регістр
лист із зазначенням а топпер відображення за LC_CTYPE категорія
поточний мовний стандарт у поверненому рядку замінюється на велику літеру
визначені відображенням. Інші персонажі в s залишаються незмінними у повернених
рядок.
Усі попередні функції, які беруть ЕРЕ як параметр очікуйте шаблон або рядок
цінний вираз, який є регулярним виразом, як визначено в регулярний Вирази.
Введення-виведення та Загальне Функції
Функції введення/виведення та загальні функції:
близько(вираз)
Закрийте файл або канал, відкритий за допомогою a друк or printf заяву або дзвінок до
getline з тим же рядковим значенням вираз. Обмеження на кількість відкритих
вираз аргументи визначається реалізацією. Якщо закриття було успішним, то
функція повертає нуль; в іншому випадку він повертає відмінний від нуля.
вираз | getline [було]
Прочитати запис введення з потоку, переданого з виводу команди. The
потік створюється, якщо на даний момент не відкрито жодного потоку зі значенням
вираз як назву команди. Створений потік має бути еквівалентним одиниці
створюється викликом до попен() функція зі значенням вираз в якості
команда аргумент і значення r в якості режим аргумент. Поки струмок
залишається відкритим, наступні дзвінки в якому вираз оцінюється до того самого рядка
value має зчитувати наступні записи з потоку. Потік залишиться
відкритий до близько Функція викликається з виразом, що має значення
те саме значення рядка. У цей час потік має бути закритий, наче закликом до
pcclose() функція. Якщо було опущено, $0 і NF встановлюється; інакше, було
повинен бути встановлений і, якщо це доречно, вважатися числовим рядком (див
Вирази in awk).
Команда getline Оператор може утворювати неоднозначні конструкції, якщо є
оператори без круглих дужок (включаючи конкатенацію) зліва від '|' (до
початок виразу, що містить getline). У контексті '$'
оператор, '|' має вести себе так, ніби вона має нижчий пріоритет, ніж '$'. Результат
оцінки інших операторів не визначено, а відповідні заявки повинні
правильно розмістити всі такі способи використання.
getline Встановіть $0 на наступний вхідний запис із поточного вхідного файлу. Ця форма
getline встановити NF, NR та ФНР змінні.
getline було
Встановити змінну було до наступного вхідного запису з поточного вхідного файлу та, якщо
відповідний, було вважатися числовим рядком (див Вирази in awk).
Ця форма getline встановити ФНР та NR змінні.
getline [було] < вираз
Прочитайте наступний запис введення з іменованого файлу. The вираз має бути
оцінюється для отримання рядка, який використовується як ім’я шляху. Якщо файл того
ім'я наразі не відкрите, його потрібно відкрити. Поки потік залишається
відкритий, наступні дзвінки в якому вираз оцінює те саме значення рядка
зчитує наступні записи з файлу. Файл залишається відкритим до
близько функція викликається з виразом, що має те саме значення
рядкове значення. Якщо було опущено, $0 і NF встановлюється; інакше, було має бути
набір і, якщо доречно, він вважається числовим рядком (див
Вирази in awk).
Команда getline Оператор може утворювати неоднозначні конструкції, якщо є
двійкові оператори без дужок (включаючи конкатенати) праворуч від '<'
(до кінця виразу, що містить getline). Результат від
оцінка такої конструкції не визначена, а відповідні програми повинні
правильно розмістити всі такі способи використання.
система(вираз)
Виконайте надану команду вираз способом, еквівалентним до система()
функцію, визначену в томі системних інтерфейсів POSIX.1‐2008, і повернути
статус виходу з команди.
Всі форми getline повертає 1 для успішного введення, нуль для кінця файлу та −1 для
помилка.
Якщо в якості імені файлу або конвеєра використовуються рядки, програма має забезпечити
що рядки текстово ідентичні. Термінологія ``однакове значення рядка'' має на увазі
ці ``еквівалентні рядки'', навіть ті, які відрізняються лише на персонажів, репрезент
різні файли.
Визначений користувачем Функції
Команда awk мова також надає визначені користувачем функції. Такі функції можна визначити як:
функція ім'я([параметр, ...]) { заяви }
На функцію можна посилатися в будь-якому місці awk програма; зокрема, його використання може
передувати його визначенню. Область дії функції є глобальною.
Параметри функції, якщо вони є, можуть бути скалярами або масивами; поведінка є
undefined, якщо ім’я масиву передається як параметр, який функція використовує як скаляр, або
якщо скалярний вираз передається як параметр, який функція використовує як масив.
Параметри функції передаються за значенням, якщо скалярний, і за посиланням, якщо ім’я масиву.
Кількість параметрів у визначенні функції не обов’язково збігається з кількістю
параметри у виклику функції. Як локальні змінні можна використовувати надлишок формальних параметрів.
Якщо у виклику функції подано менше аргументів, ніж у визначенні функції,
додаткові параметри, які використовуються в тілі функції як скаляри, повинні оцінюватися до
неініціалізоване значення, поки вони не будуть ініціалізовані іншим чином, і додаткові параметри, які
використовуються в тілі функції, оскільки масиви повинні розглядатися як неініціалізовані масиви, де
кожен елемент оцінюється до неініціалізованого значення, поки не буде ініціалізовано інакше.
Під час виклику функції не можна розміщувати пробіл між іменем функції та
розкриваюча дужка. Виклики функцій можуть бути вкладеними, а рекурсивні виклики можуть бути здійснені
функції. Після повернення з будь-якого вкладеного або рекурсивного виклику функції, значення всіх
параметри функції, що викликає, повинні бути незмінними, за винятком переданих параметрів масиву
за посиланням. The повертати оператор може використовуватися для повернення значення. Якщо повертати заяву
з’являється за межами визначення функції, поведінка не визначена.
У визначенні функції, символи мають бути необов'язковими перед відкриттям
і після закриваючої дужки. Визначення функцій можуть з’являтися в будь-якому місці програми
де візерунок-дія пара дозволена.
Граматика
Граматика в цьому розділі та лексичні конвенції в наступному розділі
разом описують синтаксис для awk програми. Загальні умовності для цього стилю
граматика описана в розділ 1.3, Граматика Умовні. Дійсною програмою може бути
представлений як нетермінальний символ більшість квитків вже розпродано! в граматиці. Цей формальний синтаксис повинен
мати пріоритет перед попереднім описом синтаксису тексту.
%токен ІМ'Я НОМЕР STRING ЕРЕ
%токен FUNC_NAME /* ІМ'Я потім by '(' без білий просторі. */
/* Ключові слова */
%токен Початок Кінець
/* 'ПОЧАТОК' 'КІНЕЦЬ' */
%token Перервати Продовжити Видалити Зробіть ще
/* 'break' 'continue' 'delete' 'do' 'else' */
%токен Вихід для функції, якщо ввімкнено
/* 'exit' 'for' 'function' 'if' 'in' */
%token Наступний друк Printf Повернути While
/* 'наступний' 'друк' 'printf' 'повернення' 'поки' */
/* Зарезервовані імена функцій */
%токен BUILTIN_FUNC_NAME
/* Один маркер для наступного:
* atan2 cos sin exp log sqrt int rand srand
* довжина індексу gsub відповідає split sprintf sub
* substr tolower toupper система закриття
*/
%токен GETLINE
/* Синтаксично відрізняється від інших вбудованих модулів. */
/* Двосимвольні лексеми. */
%токен ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/* '+=' '−=' '*=' '/=' '%=' '^=' */
%токен АБО І NO_MATCH EQ LE GE NE INCR DECR APPEND
/* '||' '&&' '!~' '==' '<=' '>=' '!=' '++' '−−' '>>' */
/* Односимвольні маркери. */
%token '{' '}' '(' ')' '[' ']' ',' ';' NEWLINE
%token '+' '−' '*' '%' '^' '!' '>' '<' '|' '?' ':' ' " " ' '$' '='
%запуск програми
%%
програма: список_елементів
| список_елементів без дії
;
item_list : newline_opt
| actionless_item_list термінатор елемента
| item_list термінатор елемента
| item_list термінатор дії
;
actionless_item_list : термінатор шаблону списку елементів
| завершувач шаблону actionless_item_list
;
елемент: дія шаблону
| Функція NAME '(' param_list_opt ')'
дія newline_opt
| Функція FUNC_NAME '(' param_list_opt ')'
дія newline_opt
;
param_list_opt: /* порожній */
| список_параметрів
;
список_параметрів: NAME
| param_list ',' NAME
;
візерунок : Початок
| Кінець
| вир
| expr ',' newline_opt expr
;
дія: '{' newline_opt '}'
| '{' newline_opt terminated_statement_list '}'
| '{' newline_opt unterminated_statement_list '}'
;
термінатор : термінатор ';'
| термінатор NEWLINE
| ';'
| НОВИЙ РЯДОК
;
Terminated_statement_list: закінчений_запис
| Terminated_statement_list terminated_statement
;
unterminated_statement_list: unterminated_statement
| Terminated_statement_list unterminated_statement
;
terminated_statement: дія newline_opt
| Якщо '(' expr ')' newline_opt terminated_statement
| Якщо '(' expr ')' newline_opt terminated_statement
Інакше newline_opt terminated_statement
| Тоді як '(' expr ')' newline_opt terminated_statement
| Для '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
закінчена_заява
| Для '(' NAME In NAME ')' newline_opt
закінчена_заява
| ';' newline_opt
| terminatable_statement NEWLINE newline_opt
| terminatable_statement ';' newline_opt
;
unterminated_statement: термінабельний_статер
| Якщо '(' expr ')' newline_opt uterminated_statement
| Якщо '(' expr ')' newline_opt terminated_statement
Інакше newline_opt unterminated_statement
| Тоді як '(' expr ')' newline_opt uterminated_statement
| Для '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
незавершена_заява
| Для '(' NAME In NAME ')' newline_opt
незавершена_заява
;
Terminatable_statement: простий_запис
| Перерву
| Продовжуйте
| Далі
| Вийти з expr_opt
| Повернути expr_opt
| Виконати newline_opt terminated_statement у той час як '(' expr ')'
;
simple_statement_opt: /* порожній */
| простий_оператор
;
simple_statement : Видалити NAME '[' expr_list ']'
| вир
| 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 '(' multiple_expr_list ')'
;
вихід_переспрямування: '>' вираз
| ДОДАТИ вираз
| '|' вир
;
expr_list_opt: /* порожній */
| список виразів
;
expr_list : вираз
| множинний_список_виразу
;
multiple_expr_list : expr ',' newline_opt expr
| multiple_expr_list ',' newline_opt expr
;
expr_opt: /* порожній */
| вир
;
вираз: унарний_вираз
| не_унарний_вираз
;
unary_expr : вираз "+".
| '−' вираз
| unary_expr '^' вираз
| unary_expr '*' вираз
| unary_expr '/' вираз
| unary_expr '%' вираз
| unary_expr '+' вираз
| unary_expr '−' вираз
| унарний_вираз не_унарний_вираз
| unary_expr '<' вираз
| unary_expr LE вираз
| unary_expr NE вираз
| unary_expr Еквалайзер вираз
| unary_expr '>' вираз
| unary_expr GE вираз
| unary_expr '~' вираз
| unary_expr NO_MATCH вираз
| unary_expr В NAME
| unary_expr І newline_opt expr
| unary_expr АБО newline_opt вираз
| unary_expr '?' expr ':' expr
| функція_унарного_введення
;
non_unary_expr: '('expr')'
| '!' вир
| non_unary_expr '^' expr
| non_unary_expr '*' вираз
| non_unary_expr '/' вираз
| non_unary_expr '%' вираз
| non_unary_expr '+' вираз
| non_unary_expr '−' вираз
| non_unary_expr non_unary_expr
| non_unary_expr '<' expr
| non_unary_expr LE вираз
| non_unary_expr NE вираз
| non_unary_expr EQ вираз
| non_unary_expr '>' вираз
| не_унарний_вираз GE вираз
| non_unary_expr '~' вираз
| non_unary_expr NO_MATCH вираз
| non_unary_expr В NAME
| '(' multiple_expr_list ')' в NAME
| non_unary_expr І newline_opt expr
| non_unary_expr АБО newline_opt expr
| non_unary_expr '?' expr ':' expr
| НОМЕР
| STRING
| lvalue
| ERE
| lзначення INCR
| lзначення DECR
| Значення INCR
| Значення DECR
| 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 '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
| не_унарна_функція_введення
;
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 non_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: '('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
| НОМЕР
| STRING
| lvalue
| ERE
| lзначення INCR
| lзначення DECR
| Значення INCR
| Значення DECR
| 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 '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
;
lзначення: NAME
| NAME '['expr_list ']'
| '$' вираз
;
non_unary_input_function: simple_get
| simple_get '<' вираз
| non_unary_expr '|' simple_get
;
unary_input_function: unary_expr '|' simple_get
;
simple_get : GETLINE
| GETLINE lvalue
;
newline_opt: /* порожній */
| newline_opt NEWLINE
;
У цій граматиці є кілька неясностей, які потрібно вирішити наступним чином:
* Пріоритетність та асоціативність оператора мають бути такими, як описано в таблиця 4-1, Вирази
in Зниження Пріоритет in awk.
* У разі неясності, an ще має бути пов'язано з найбільш безпосереднім попереднім
if це задовольнило б граматику.
* У деяких контекстах а ('/'), який використовується для оточування ERE, також може бути
оператор поділу. Це має бути вирішено таким чином, щоб де б не було поділу
може з’явитися оператор, a вважається оператором поділу. (Немає
оператор унарного ділення.)
Кожен вираз в an awk програма повинна відповідати правилам пріоритету та асоціативності,
навіть якщо це не потрібно для вирішення неясності. Наприклад, тому що '$' має вищу
пріоритет ніж '++', рядок "$x++−−" не є дійсним awk вираз, хоча воно є
однозначно розібраний граматикою як "$(x++)-−".
Одна умова, яка може бути неочевидною з формальної граматики, це де
символи прийнятні. Існує кілька очевидних місць розташування, наприклад завершення a
заява, і а можна використовувати для втечі символів між будь-якими
лексичні лексеми. В додаток, символи без персонажі можуть
після коми, відкритої дужки, логічного оператора І ("&&"), логічний оператор АБО ("||"),
do ключове слово, ще ключове слово та закриваючу дужку an if, та цінностіабо в той час як
заява. Наприклад:
{ друк $ 1,
$2 }
Лексичні Умовні
Лексичні умовності для awk програми, щодо попередньої граматики, мають бути
наступним чином:
1. За винятком зазначеного, awk повинні розпізнавати найдовший можливий маркер або початок роздільника
в дану точку.
2. Коментар має складатися з будь-яких символів, які починаються з характер
і припиняється, але за винятком наступного випадку, а . Коментарі повинні
не мають жодного ефекту, окрім як розмежування лексичних лексем.
3. В буде визнано маркером НОВИЙ РЯДОК.
4. А символ, за яким одразу слідує a не матиме ніякого ефекту.
5. Лексема STRING представлятиме константу рядка. Рядкова константа повинна починатися з
персонаж """. У межах константи рядка a характер має бути
розглядається як початок вихідної послідовності, як зазначено в таблиці в базі
Том визначень POSIX.1-2008, Глава 5, Файл сформований нотація ('\\', '\a', '\b',
'\ f', '\ n', '\ r', '\ t', '\ v'). Крім того, вихідні послідовності в таблиця 4-2, Бігти
Послідовності in awk повинні бути визнані. А не повинно зустрічатися всередині рядка
постійний. Рядкова константа завершується першим неекранованим входженням
персонаж """ після тієї, з якої починається рядкова константа. Значення
рядок має бути послідовністю всіх неекранованих символів і значень escape
послідовності між двома розмежуючими, але не включаючи """ символів.
6. Лексема ЕРЕ представляє константу розширеного регулярного виразу. Константа ERE
почнеться з характер. У межах константи ERE a
символ вважається таким, що починається escape-послідовність, як зазначено в таблиці в
том Base Definitions POSIX.1-2008, Глава 5, Файл сформований нотація, в
крім того, вихідні послідовності в таблиця 4-2, Бігти Послідовності in awk має бути
визнаний. Заявка повинна гарантувати, що a не відбувається в межах ERE
постійний. Константа ERE завершується першим неекранованим входженням
символ після того, з якого починається константа ERE. Розширений регулярний
вираз, представлений константою ERE, має бути послідовністю всіх неекранованих
символи та значення escape-послідовностей між ними, але не включаючи
розмежування символів.
7. А не матиме ніякої дії, за винятком розмежування лексичних лексем або всередині STRING or
ЕРЕ лексеми.
8. Лексема НОМЕР представлятиме числову константу. Його форма та числове значення мають
або бути еквівалентним до десяткова-плаваюча-постійна токен, як зазначено в ISO C
стандарт, або це має бути послідовність десяткових цифр і оцінюватися як
ціла константа в десятковій системі. Крім того, реалізації можуть приймати числові константи
з формою та числовим значенням, еквівалентними шістнадцяткова-постійна та
шістнадцяткова-плаваюча-постійна токени відповідно до стандарту ISO C.
Якщо значення занадто велике або занадто мале, щоб його можна було представити (див розділ 1.1.2,
Поняття Отриманий від ISO C стандарт), поведінка не визначена.
9. Послідовність символів підкреслення, цифр і алфавітів із переносного набору символів
(див. том Base Definitions POSIX.1-2008, розділ 6.1, Портативний Характер
Установка), починаючи з an або алфавітним символом, вважається a
слово
10. Наступні слова є ключовими словами, які розпізнаються як окремі токени; в
назва токена збігається з ключовим словом:
ПОЧАТИ видаляти END функція in printf
перерву do вихід getline наступний повертати
продовжувати ще та цінності if друк в той час як
11. Наступні слова є назвами вбудованих функцій і повинні розпізнаватися як
знак BUILTIN_FUNC_NAME:
атан2 gsub журнал розкол нижче топпер
близько індекс матч спринт субстр
ство Int рядок кв система
ехр гріх сранд знизити
Перераховані вище ключові слова та назви вбудованих функцій вважаються зарезервованими
слова.
12. Лексема ІМ'Я має складатися зі слова, яке не є ключовим словом чи ім’ям вбудованого
функція і не відразу (без будь-яких роздільників) слідує за ним '('
характер.
13. Лексема FUNC_NAME має складатися зі слова, яке не є ключовим словом чи ім’ям a
вбудована функція, за якою відразу (без будь-яких роздільників) слідує символ '(' характер.
Команда '(' символ не включається як частина токена.
14. Наступні двосимвольні послідовності розпізнаються як іменовані лексеми:
┌───────────┬──────────┬─────────────┬──────────┐
│Знак ІМ'Я │ Послідовність │ Знак ІМ'Я │ Послідовність │
├────────────┼──────────┼─────────────┼──────────┤
│ADD_ASSIGN │ += │ NO_MATCH │ !~ │
│SUB_ASSIGN │ −= │ EQ │ == │
│MUL_ASSIGN │ *= │ LE │ <= │
│DIV_ASSIGN │ /= │ GE │ >= │
│MOD_ASSIGN │ %= │ NE │ != │
│POW_ASSIGN │ ^= │ ІНКР │ ++ │
│OR │ || │ DECR │ −− │
│І │ && │ ДОДАТОК │ >> │
└───────────┴──────────┴─────────────┴──────────┘
15. Наступні поодинокі символи розпізнаються як токени, імена яких є
Характер:
{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =
Між лексемою існує лексична неоднозначність ЕРЕ і токени '/' та DIV_ASSIGN.
Коли вхідна послідовність починається з a символ у будь-якому синтаксичному контексті, де
знак '/' or DIV_ASSIGN може відображатися як наступний маркер у дійсній програмі, довше з
ті два токени, які можна розпізнати, повинні бути розпізнані. У будь-якій іншій синтаксиці
контекст, де лексема ЕРЕ може відображатися як наступний маркер у дійсній програмі, маркер
ЕРЕ повинні бути визнані.
EXIT СТАТУС
Повинні бути повернуті такі вихідні значення:
0 Усі вхідні файли оброблено успішно.
>0 Сталася помилка.
Статус виходу можна змінити в програмі за допомогою вихід вираз.
НАСЛІДКИ OF ПОМИЛКИ
Якщо хто-небудь файл вказано операнд, і названий файл недоступний, awk напише а
діагностичне повідомлення до стандартної помилки та припинити роботу без будь-яких подальших дій.
Якщо програма, визначена одним із файлів більшість квитків вже розпродано! операнд або а профіль операнд не є a
дійсний awk програми (як зазначено в розділі РОЗШИРЕНИЙ ОПИС), поведінка є
невизначений.
Команда після розділам він має інформативний.
ЗАСТОСУВАННЯ ВИКОРИСТАННЯ
Команда індекс, , матч та субстр функції не слід плутати з подібними
функціонує в стандарті ISO C; в awk версії мають справу з символами, тоді як ISO C
стандартні операції з байтами.
Оскільки операція конкатенації представлена суміжними виразами, а не символом
явний оператор, часто необхідно використовувати дужки, щоб забезпечити належне
пріоритет оцінки.
ПРИКЛАДИ
Команда awk Програму, зазначену в командному рядку, найлегше вказати в межах одного
лапки (наприклад, 'більшість квитків вже розпродано!') для додатків, які використовують sh, Так як awk програми зазвичай
містять символи, які є особливими для оболонки, включаючи подвійні лапки. У випадках
де awk Програма містить символи одинарних лапок, зазвичай їх найпростіше вказати
більшість програми у вигляді рядків у одинарних лапках, об’єднаних оболонкою з лапками
символи одинарних лапок. Наприклад:
awk '/'\'/ { друк "цитата:", $0 }'
друкує всі рядки зі стандартного введення, що містять одинарні лапки з префіксом
з цитувати:.
Нижче наведені приклади простих awk програми:
1. Запишіть на стандартний вихід всі рядки введення, для яких поле 3 більше 5:
$3 > 5
2. Запишіть кожен десятий рядок:
(НР % 10) == 0
3. Напишіть будь-який рядок з підрядком, що відповідає регулярному виразу:
/(G|D)(2[0−9][[:alpha:]]*)/
4. Надрукуйте будь-який рядок з підрядком, що містить a "G" or 'D', за яким слідує послідовність
цифри та символи. У цьому прикладі використовуються класи символів цифра та альфа щоб відповідати
незалежні від мови цифри та символи алфавіту відповідно:
/(G|D)([[:цифра:][:альфа:]]*)/
5. Напишіть будь-який рядок, у якому друге поле відповідає регулярному виразу та четвертому
поле не містить:
$2 " " /xyz/ && $4 ! " " /xyz/
6. Запишіть будь-який рядок, у якому друге поле містить a :
$2 " " /\\/
7. Запишіть будь-який рядок, у якому друге поле містить a . Зауважте, що
- втечі інтерпретуються двічі; один раз у лексичній обробці рядка
і один раз під час обробки регулярного виразу:
$2 " " "\\\\"
8. Запишіть друге до останнього та останнє поле в кожному рядку. Розділіть поля а
:
{OFS=":";друк $(NF−1), $NF}
9. Запишіть номер рядка та кількість полів у кожному рядку. Три струни
що представляє номер рядка, , і кількість полів об’єднана
і цей рядок записується до стандартного виводу:
{друк NR «» NF}
10. Напишіть рядки довше 72 символів:
довжина ($0) > 72
11. Запишіть перші два поля в протилежному порядку, розділивши їх символами ОФС:
{ друк $ 2, $1 }
12. Те саме, з полями введення, розділеними символом a або і символи, або
обидва:
ПОЧАТИ { FS = ",[ \t]*|[ \t]+" }
{ друк $ 2, $1 }
13. Складіть перший стовпець, надрукуйте суму та середнє:
{s += $1 }
END {друк "сума is ", s, " середній є", s/NR}
14. Запишіть поля в зворотному порядку, по одному на рядок (багато рядків для кожного рядка):
{ та цінності (i = НФ; i > 0; −−i) друк $i }
15. Запишіть усі рядки між входженнями рядків старт та СТОП:
/почати/, /Стоп/
16. Запишіть усі рядки, перше поле яких відрізняється від попереднього:
$1 != Попередня { друкувати; Попередня = $1 }
17. Моделювати нудьгувати:
ПОЧАТИ {
та цінності (i = 1; i < ARGC; ++i)
printf("%s%s", ARGV[i], i==ARGC−1?"\n":" ")
}
18. Напишіть префікси шляху, що містяться в PATH змінна середовища, одна на рядок:
ПОЧАТИ {
n = розкол (СЕРЕДОВИЩЕ["PATH"], шлях, ":")
та цінності (i = 1; i <= n; ++i)
друк шлях[i]
}
19. Якщо є файл з іменем вхід містить заголовки сторінок у формі: Сторінка №
і файл з іменем більшість квитків вже розпродано! що містить:
/Сторінка/ { $2 = n++; }
{ друк }
потім командний рядок:
awk −f більшість квитків вже розпродано! n = 5 вхід
друкує файл вхід, заповнюючи номери сторінок, починаючи з 5.
ОБГОВОРЕННЯ
Цей опис заснований на новому awk, ``nawk'', (див. посилання на посилання Команда AWK
Програмування Language), який вніс ряд нових рис в істор awk:
1. Нові ключові слова: видаляти, do, функція, повертати
2. Нові вбудовані функції: атан2, близько, ство, gsub, матч, рядок, гріх, сранд, нижче, система
3. Нові попередньо визначені змінні: ФНР, ARGC, ARGV, RSTART, ДОВЖИНА, СУБСЕП
4. Нові оператори виразів: ?, :, ,, ^
5. FS змінна і третій аргумент до розкол, тепер розглядається як розширений регулярний
вирази.
6. Пріоритет оператора, змінений, щоб більше відповідати мові C. Два приклади
коду, які працюють по-різному:
в той час як ( n /= 10 > 1) ...
if ("тиж" ~ /bwk/) ...
На основі нових реалізацій було додано кілька функцій awk:
* Кілька випадків −f профіль дозволені.
* Нова опція −v доручення.
* Нова попередньо визначена змінна СЕРЕДОВИЩЕ.
* Нові вбудовані функції топпер та знизити.
* Додано додаткові можливості форматування printf відповідати стандарту ISO C.
Загальний awk Синтаксис завжди базувався на мові C з деякими функціями
командна мова оболонки та інші джерела. Через це не повністю
сумісний з будь-якою іншою мовою, що викликало плутанину у деяких користувачів. Це не
намір розробників стандарту вирішити такі проблеми. Кілька відносно незначних
було внесено зміни, спрямовані на підвищення сумісності мови зі стандартом ISO C; більшість
з цих змін ґрунтуються на подібних змінах останніх реалізацій, як описано
вище. Залишається кілька конвенцій про мову C, яких немає awk. Один з
примітними є оператор, який зазвичай використовується для визначення кількох
вирази мовою C та цінності заяву. Крім того, є різні місця, де awk is
більш обмежувальний, ніж мова C, щодо типу виразу, в якому можна використовувати
заданий контекст. Ці обмеження пов’язані з різними функціями awk мова
забезпечує.
Регулярні вирази в awk були дещо розширені від історичних реалізацій до
зробити їх чистим наднабором розширених регулярних виразів, як визначено в POSIX.1-2008 (див.
том Base Definitions POSIX.1-2008, розділ 9.4, Розширений регулярний Вирази).
Основними розширеннями є функції інтернаціоналізації та інтервальні вирази. Історичний
реалізації awk давно підтримують -екранні послідовності як розширення до
розширені регулярні вирази, і це розширення було збережено, незважаючи на невідповідність
з іншими комунальними послугами. Кількість вихідних послідовностей, розпізнаних в обох розширених регулярних
вирази та рядки відрізняються (загалом збільшуються з часом) у різних реалізаціях.
Набір, визначений POSIX.1-2008, включає більшість послідовностей, які, як відомо, підтримуються популярними
реалізації та за стандартом ISO C. Одна послідовність, яка не підтримується
шістнадцяткове значення екранує, починаючи з '\x'. Це дозволило б значення, виражені в більшій кількості
ніж 9 біт, які будуть використані в межах awk як у стандарті ISO C. Однак через цей синтаксис
має недетерміновану довжину, це не дозволяє наступному символу бути a
шістнадцятковий розряд. Це обмеження можна вирішити в мові C за допомогою
конкатенація лексичних рядків. В awk мови, конкатенація також може бути рішенням
для рядків, але не для розширених регулярних виразів (або лексичних маркерів ERE, або
рядки, які динамічно використовуються як регулярні вирази). Через це обмеження функція
не було додано до POSIX.1-2008.
Коли рядкова змінна використовується в контексті, де зазвичай розширений регулярний вираз
з’являється (де в граматиці використовується лексична лексема ERE), рядок не містить
буквальний символів.
Деякі версії awk дозволити форму:
функц ім'я (args, ... ) { заяви }
Автори мови заперечували це, попросивши, щоб цього не було
вказано.
Історичні реалізації awk видає помилку, якщо a наступний оператор виконується в a
ПОЧАТИ дія і причина awk припинити, якщо a наступний оператор виконується в an END дії.
Така поведінка не була задокументована, і не вважалося, що це потрібно
стандартизувати його.
Специфікація перетворень між рядковими і числовими значеннями є набагато більш детальною
ніж у документації історичних реалізацій або в посиланнях Команда AWK
Програмування Language. Хоча більшість поведінки розроблено так, щоб бути інтуїтивним,
деталі необхідні для забезпечення сумісної поведінки з різних реалізацій. Це
це особливо важливо в реляційних виразах, оскільки типи операндів
визначити, чи виконується рядкове чи числове порівняння. З точки зору а
Розробнику додатків зазвичай достатньо очікувати інтуїтивної поведінки і примусу
перетворення (шляхом додавання нуля або конкатенації нульового рядка), коли тип виразу
явно не відповідає тому, що потрібно. Мета полягала в тому, щоб уточнити історію
практика майже у всіх випадках. Єдиним винятком є те, що в історичних реалізаціях
змінні та константи зберігають як рядкові, так і числові значення після їх початкового значення
перетворюється будь-яким використанням. Це означає, що посилання на змінну або константу може мати
несподівані побічні ефекти. Наприклад, з історичними реалізаціями наступне
програма:
{
a = "+ 2"
b = 2
if (НР % 2)
c = a + b
if (a == b)
друк «числовий порівняння"
ще
друк «рядок порівняння"
}
виконуватиме числове порівняння (і виводить числове порівняння) для кожного непарного
рядок, але виконайте порівняння рядків (і вихідне порівняння рядків) для кожного парного
пронумерований рядок. POSIX.1-2008 гарантує, що порівняння будуть числовими, якщо це необхідно. З
історичні реалізації, така програма:
ПОЧАТИ {
OFMT = "%e"
друк 3.14
OFMT = "%f"
друк 3.14
}
вивело б "3.140000e+00" двічі, тому що в другому друк твердження константи
"3.14" матиме рядкове значення з попереднього перетворення. POSIX.1-2008 вимагає цього
вихід другого друк заява бути "3.140000". Поведінка істор
Реалізація вважалася занадто неінтуїтивною та непередбачуваною.
Було зазначено, що з правилами, що містяться в ранніх чернетках, наступний сценарій
нічого не друкуватиме:
ПОЧАТИ {
y [1.5] = 1
OFMT = "%e"
друк y [1.5]
}
Отже, нова змінна, CONVFMT, було введено. The OFMT змінна тепер обмежена
впливаючи на перетворення вихідних чисел у рядки та CONVFMT використовується для внутрішнього
конверсії, такі як порівняння або індексування масивів. Значення за замовчуванням таке саме
та цінності OFMT, тож якщо програма не зміниться CONVFMT (що не зробила б жодна історична програма), це
отримає історичну поведінку, пов’язану з внутрішніми перетвореннями рядків.
POSIX awk лексичні та синтаксичні конвенції визначені більш формально, ніж в інших
джерела. Знову метою було конкретизувати історичну практику. Одна конвенція, яка може
не очевидно з формальної граматики, як і в інших словесних описах де
символи прийнятні. Існує кілька очевидних місць розташування, наприклад завершення a
заява, і а можна використовувати для втечі символів між будь-якими
лексичні лексеми. В додаток, символи без персонажі можуть
після коми, відкритої дужки, логічного оператора І ("&&"), логічний оператор АБО
("||") do ключове слово, ще ключове слово та закриваючу дужку an if, та цінностіабо
в той час як заява. Наприклад:
{ друк $ 1,
$2 }
Вимога, що awk додати кінець до тексту аргументу програми є to
спростити граматику, щоб вона відповідала текстовому файлу за формою. Немає способу для
додаток або тестовий набір, щоб визначити, чи є літералом додається чи чи awk
просто діє так, ніби так.
POSIX.1‐2008 вимагає кількох змін від історичних реалізацій для підтримки
інтернаціоналізація. Мабуть, найтоншим із них є використання десяткової коми
характер, визначений за LC_NUMERIC категорія місцевості, у уявленнях про
числа з плаваючою комою. Цей характерний для локалі символ використовується для розпізнавання числових
введення, перетворення між рядками та числовими значеннями та форматування виводу.
Однак, незалежно від місцевості, символ (знак десяткової коми
Локаль POSIX) — це десятковий символ, який розпізнається під час обробки awk програми
(включаючи призначення в аргументах командного рядка). Це, по суті, та сама конвенція
як той, який використовується в стандарті ISO C. Різниця в тому, що мова C включає в себе
setlocale() функція, яка дозволяє програмі змінювати свою локаль. Тому що
Можливість, програма C починає виконуватися з локалем, встановленим на мовний стандарт C, і тільки
виконується у визначеному середовищі локалі після явного виклику до setlocale†
Однак, додавши таку складну нову функцію до awk мова розглядалася як
не підходить для POSIX.1-2008. Можна виконати an awk програму явно в будь-якому
бажану локаль, встановивши середовище в оболонці.
Невизначена поведінка, що є результатом NUL в розширених регулярних виразах, забезпечує майбутнє
розширення для GNU гаук програма для обробки двійкових даних.
Поведінка у випадку недійсного awk програми (включаючи лексичні, синтаксичні та
семантичні помилки) не визначено, оскільки вважалося, що він надмірно обмежує реалізації
уточнити. У більшості випадків можна очікувати, що такі помилки призведуть до діагностики та не
нульовий статус виходу. Однак деякі реалізації можуть розширити мову
які використовують певні недійсні конструкції. Інші недійсні конструкції можуть вважатися
заслуговує на попередження, але в іншому випадку викликає певну розумну поведінку. Ще інші конструкції
може бути дуже важко виявити в деяких реалізаціях. Крім того, різні реалізації
може виявити певну помилку під час початкового аналізу програми (перед читанням будь-якої
вхідні файли), тоді як інші можуть виявити це під час виконання програми після читання деяких
введення. Виконавці повинні знати, що діагностувати помилки якомога раніше і
створення корисної діагностики може полегшити налагодження програм і, таким чином, зробити
реалізація більш зручна.
Невизначена поведінка від використання кількох символів RS цінності, щоб дозволити можливе майбутнє
розширення на основі розширених регулярних виразів, що використовуються для роздільників записів. Історичний
реалізації беруть перший символ рядка і ігнорують інші.
Невизначена поведінка, коли розкол(рядок,масив, ) використовується, щоб дозволити пропоноване майбутнє
розширення, яке розбиває рядок на масив окремих символів.
У контексті getline функція, однаково хороші аргументи для різних пріоритетів
в | та < можна зробити оператори. Історична практика така:
getline < "A" "b"
аналізується як:
( getline < "A" ) "b"
хоча багато хто стверджує, що намір полягав у тому, щоб файл ab слід прочитати. однак:
getline < "х" + 1
аналізує як:
getline < ( "х" + 1 )
Подібні проблеми виникають і з | версія getline, особливо в поєднанні з $.
Наприклад:
$"луна Привіт" | getline
(Ця ситуація є особливо проблематичною при використанні в a друк заяву, де
| отримати лінію частина може бути перенаправленням друк.)
Оскільки в більшості випадків такі конструкції не використовуються (або принаймні не повинні) використовуватися (оскільки вони
мають природну неоднозначність, для якої не існує звичайного розбору), значення цих
конструкції було зроблено явно невизначеними. (Ефект полягає в тому, що відповідний
Програма, яка стикається з проблемою, повинна поміщатися в дужки, щоб вирішити неоднозначність.) Там
Виявилося, що фактичне використання таких конструкцій невелике.
Можна написати граматику, яка за цих обставин призведе до помилки. Де
Зворотна сумісність не є важливим фактором, розробники можуть захотіти використовувати це
граматики.
Деякі історичні реалізації дозволили викликати деякі вбудовані функції без
список аргументів, результатом якого є список аргументів за замовчуванням, вибраний у якомусь ``розумному''
спосіб. Використання як синонім для довжина ($0) є єдиною з цих форм
вважаються широко відомими або широко використовуваними; ця конкретна форма задокументована в різних
місця (наприклад, більшість історичних awk довідкові сторінки, хоча і не в посиланнях
Команда AWK Програмування Language) як законна практика. За цим винятком, за замовчуванням
Списки аргументів завжди були недокументовані та нечітко визначені, і це не так
ясно, як (або якщо) вони мають бути узагальнені на визначені користувачем функції. Корисного вони не додають
функціональність і виключати можливі майбутні розширення, яким може знадобитися назвати функції
не дзвонивши їм. Не стандартизувати їх здається найпростішим курсом. Стандарт
розробники вважали це однак заслуговує особливого ставлення, оскільки так було
задокументовані в минулому і бачить, можливо, суттєве використання в історичних програмах.
Відповідно, це використання було визнано законним, але Випуск 5 видалив застаріле
маркування для реалізацій, що відповідають XSI, і багатьох інших додатків
залежать від цієї функції.
In нижче та gsub, Якщо репл є рядковим літералом (лексична лексема STRING), потім дві
послідовний символи повинні використовуватися в рядку для забезпечення єдиного
буде передувати коли результуючий рядок передається в
функція. (Наприклад, щоб вказати один литерал у рядку заміни, використовуйте
gsub(ЕРЕ, "\\&").)
Історично, єдиний особливий персонаж у репл аргумент нижче та gsub рядок
функції була ('&') символ і перед ним з
символ використовувався, щоб вимкнути його особливе значення.
Опис у стандарті ISO POSIX‐2:1993 вводить поведінку, таку, що
символ був іншим спеціальним символом, і не було визначено, чи є він
були будь-які інші спеціальні символи. Цей опис представив кілька переносимостей
проблеми, деякі з яких описані нижче, і тому він був замінений на більше
історичний опис. Деякі з проблем включають:
* Історично для створення рядка заміни міг використовуватися сценарій gsub(ЕРЕ, "\\&"),
але зі стандартним формулюванням ISO POSIX‐2:1993 його необхідно було використовувати gsub(ЕРЕ,
"\\\\&"). The символи тут подвоюються, тому що всі рядкові літерали є такими
підлягає лексичному аналізу, який би скоротив кожну пару символів до
Одинокий перед тим, як передати до gsub.
* Оскільки не було визначено, що таке спеціальні символи для переносимих скриптів
гарантувати, що символи друкуються буквально, перед кожним символом має бути
з . (Наприклад, довелося використовувати переносний скрипт gsub(ЕРЕ, "\\Привіт"), Щоб
створити рядок для заміни "Привіт".)
Опис для порівнянь у стандарті ISO POSIX‐2:1993 не описав належним чином
історична практика через те, як числові рядки порівнюються як числа. The
поточні правила викликають наступний код:
if (0 == "000")
друк "дивно, але правда"
ще
друк «ні правда"
зробити числове порівняння, викликаючи if для досягнення успіху. Це має бути інтуїтивно очевидним
що це некоректна поведінка, і справді, ніякої історичної реалізації awk насправді
поводиться таким чином.
Щоб вирішити цю проблему, визначення числовий рядок було розширено, щоб включити лише ті
значення, отримані з конкретних обставин (переважно зовнішніх джерел), де його немає
можна однозначно визначити, чи має значення це рядок чи a
числовий.
Змінні, які призначені числовому рядку, також розглядаються як числовий рядок.
(Наприклад, поняття числового рядка можна поширювати між присвоюваннями.) In
порівняння, усі змінні, що мають неініціалізоване значення, повинні розглядатися як числові
операнд обчислюється нульовим числовим значенням.
Неініціалізовані змінні включають всі типи змінних, включаючи скаляри, елементи масиву,
і поля. Визначення неініціалізованого значення в Змінні та спеціальний Змінні is
необхідний для опису значень, розміщених у неініціалізованих змінних і в полях, які є
дійсний (наприклад, < $NF), але в них немає символів і описувати, як це відбувається
змінні слід використовувати в порівняннях. Допустиме поле, наприклад $1, що не має символів
в ньому можна отримати з рядка введення "\t\t" коли FS='\t'. Історично склалося так, що
порівняння ($110) було виконано чисельно після оцінки $1 до значення нуль.
Фразу ``... також має мати числове значення числового рядка'' було видалено
з кількох розділів стандарту ISO POSIX‐2:1993, оскільки вказується непотрібне
деталі реалізації. Для POSIX.1‐2008 не обов’язково вказувати, що ці об’єкти
призначаються два різні значення. Необхідно лише вказати, що ці об'єкти можуть
оцінювати до двох різних значень залежно від контексту.
Історичні реалізації awk не аналізував шістнадцяткові цілі чи плаваючі константи
як "0xa" та "0xap0". Через помилку видання цього документу 2001–2004 рр
стандартна необхідна підтримка шістнадцяткових плаваючих констант. Це сталося через
посилання на atof(). Ця версія стандарту дозволяє, але не вимагає
реалізації для використання atof() і містить опис того, як є числа з плаваючою комою
визнано альтернативою відповідності історичній поведінці. Мета цієї зміни полягає в тому, щоб
дозволяють реалізації розпізнавати константи з плаваючою комою відповідно до
Стандарт ISO/IEC 9899:1990 або стандарт ISO/IEC 9899:1999, а також дозволити (але не вимагати)
реалізації для розпізнавання шістнадцяткових цілочисельних констант.
Історичні реалізації awk не підтримує нескінченності з плаваючою комою та NaN
числовий струни; наприклад, "−INF" та "NaN". Однак реалізації, які використовують atof() або
strtod() для виконання перетворення підтримали ці значення, якщо вони використовували a
Стандартна версія функції ISO/IEC 9899:1999 замість стандарту ISO/IEC 9899:1990
версія. Через помилку видання цього стандарту 2001–2004 років не
дозволити підтримку нескінченності та NaN, але в цій редакції підтримка дозволена (але ні
вимагається). Це мовчазна зміна поведінки awk програми; наприклад, в
POSIX локалізація виразу:
("-INF" + 0 < 0)
раніше мав значення 0, оскільки "−INF" перетворюється на 0, але тепер він може мати значення 0 або
1.
Майбутнє НАПРЯМКИ
Ні.
Використовуйте awkposix онлайн за допомогою служб onworks.net