Ukranianфранцузькийнімецькийіталійськийпортугальськаросійськаіспанська

Значок OnWorks

mawk - онлайн у хмарі

Запустіть mawk у постачальнику безкоштовного хостингу OnWorks через Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

Це команда mawk, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

ПРОГРАМА:

ІМ'Я


mawk - мова сканування шаблонів і обробки тексту

СИНТАКСИС


mawk [-W варіант] [-F значення] [-v var=значення] [--] 'текст програми' [файл ...]
mawk [-W варіант] [-F значення] [-v var=значення] [-f програмний файл] [--] [файл ...]

ОПИС


mawk є інтерпретатором мови програмування AWK. Мова AWK корисна для
маніпулювання файлами даних, пошук і обробка тексту, а також для створення прототипів і
експериментувати з алгоритмами. mawk це новий awk це означає, що він реалізує мову AWK
як визначено в Aho, Kernighan і Weinberger, повне г, повне г,, показали, від, номер, XNUMX AWK Програмування Мову, Аддісон-Веслі
Publishing, 1988. (Далі іменується як книга AWK.) mawk відповідає Posix
1003.2 (проект 11.3) визначення мови AWK, яке містить кілька функцій, які не
описано в книзі AWK, і mawk забезпечує невелику кількість розширень.

Програма AWK - це послідовність модель {дія} пари та визначення функцій. Короткий
програми вводяться в командному рядку, зазвичай укладеному в ' ', щоб уникнути оболонки
інтерпретація. Довші програми можна прочитати з файлу з опцією -f. Дані
введення зчитується зі списку файлів у командному рядку або зі стандартного введення, коли
список порожній. Вхідні дані розбиваються на записи відповідно до роздільника записів
змінна, RS. Спочатку, RS = "\n", а записи є синонімами рядків. Кожен запис є
порівнювати з кожним модель і якщо він відповідає, текст програми для {дія} is
страчено.

ВАРІАНТИ


-F значення встановлює роздільник полів, FS, Щоб значення.

-f файл Текст програми читається з файл замість командного рядка. Кілька
-f можливі варіанти.

-v var=значення призначає значення до змінної програми було.

-- вказує на однозначне закінчення опцій.

Наведені вище параметри будуть доступні з будь-якою реалізацією AWK, сумісною з Posix, і
конкретні варіанти реалізації передують -W. mawk забезпечує шість:

-W версія mawk записує свою версію та авторські права на стандартний вихід і скомпільовані обмеження
stderr і виходить 0.

-W dump пише на асемблері список внутрішнього представлення файлу
програма на стандартний вихід і виходить з 0 (при успішній компіляції).

-W інтерактивний надає небуферизований запис у стандартний вихід, а рядковий буферизований читання з stdin.
Записи з stdin є рядками незалежно від значення RS.

-W Exec файл Текст програми читається з файл і це останній варіант. Корисно на
системи, які підтримують #! Угода про "магічне число" для виконуваного файлу
скриптів.

-W sprintf=Num регулює розмір mawk's внутрішній буфер sprintf для Num байтів. Більше ніж
рідкісне використання цієї опції свідчить mawk слід перекомпілювати.

-W posix_космічні сили mawk не вважати '\n' пробілом.

Короткі форми -W[vdiesp] розпізнаються і в деяких системах -We необхідно уникати
обмеження довжини командного рядка.

THE AWK МОВА


1. програма структура
Програма AWK - це послідовність модель {дія} пари та визначення функцій користувача.

Візерунок може бути:
ПОЧАТИ
END
вираз
вираз, вираз

Один, але не обидва модель {дія} можна опустити. Якщо {дія} опущено це
неявно { print }. Якщо модель опущено, то воно неявно збігається. ПОЧАТИ і
END шаблони вимагають дії.

Операції закінчуються новими рядками, крапкою з комою або тим і іншим. Групи висловлювань напр
дії або тіла циклу блокуються через { ... }, як у C. Останній оператор у блоці
не потрібен термінатор. Порожні рядки не мають значення; порожній оператор припиняється
з крапкою з комою. Довгі оператори можна продовжити зворотною косою рискою, \. Заява може
бути розбитим без зворотної косої риски після коми, лівої дужки, &&, ||, do, ще, право
дужки an if, в той час як or та цінності оператор і права дужка функції
визначення. Коментар починається з # і поширюється до кінця рядка, але не містить його.

Наступні оператори керують ходом програми всередині блоків.

if ( експр ) заяву

if ( експр ) заяву ще заяву

в той час як ( експр ) заяву

do заяву в той час як ( експр )

та цінності ( opt_expr ; opt_expr ; opt_expr ) заяву

та цінності ( було in масив ) заяву

продовжувати

перерву

2. дані типи, Перетворення і порівняння
Існує два основних типи даних: числові та рядкові. Числові константи можуть бути цілочисельними
-2, десятковий, наприклад 1.08, або в науковому позначенні, як-1.1e4 або .28E-3. Всі числа є
представлені внутрішньо, і всі обчислення виконуються в арифметиці з плаваючою комою. Тож для
Наприклад, вираз 0.2e2 == 20 є істинним, а true представлено як 1.0.

Рядкові константи беруться в подвійні лапки.

"Це рядок з новим рядком в кінці.\n"

Рядки можна продовжити через рядок, екрануючи (\) новий рядок. Наступна втеча
послідовності розпізнаються.

\\ \
\" "
\a alert, ascii 7
\b Backspace, ascii 8
\t вкладка, ascii 9
\n новий рядок, ascii 10
\v вертикальна вкладка, ascii 11
\f подача форми, ascii 12
\r повернення каретки, ascii 13
\ddd 1, 2 або 3 вісімкові цифри для ascii ddd
\xhh 1 або 2 шістнадцяткові цифри для ascii hh

Якщо ви екрануєте будь-який інший символ \c, ви отримуєте \c, тобто mawk ігнорує втечу.

Насправді існує три основних типи даних; третій є номер і рядок який має обидва a
числове значення і значення рядка одночасно. Входять визначені користувачем змінні
існування при першому посиланні та ініціалізації нулю, число та рядкове значення
який має числове значення 0 і рядкове значення "". Нетривіальні числові та рядкові дані
надходять із введення і зазвичай зберігаються в полях. (Див. розділ 4).

Тип виразу визначається його контекстом і автоматичним перетворенням типів
відбувається у разі потреби. Наприклад, для оцінки висловлювань

y = x + 2 ; z = x "привіт"

Значення, що зберігається у змінній y, буде введено числовим. Якщо x не є числовим, значення зчитується
з x перетворюється в числове, перш ніж додається до 2 і зберігається в y. Збережене значення
у змінній z буде введено string, а значення x буде перетворено в рядок if
необхідний і об’єднаний із «привіт». (Звичайно, значення і тип, що зберігаються в x, є
не змінюється жодними перетвореннями.) Рядковий вираз перетворюється на числовий за допомогою його
найдовший числовий префікс як з atof(3). Числовий вираз перетворюється на рядковий
замінивши експр з sprintf(CONVFMT, експр), хіба що експр може бути представлений на хості
машина як точне ціле число, потім воно перетворюється в спринт("%d", експр). Sprintf() є
Вбудований AWK, який дублює функціональність спринт(3), і CONVFMT є вбудованим
змінна, яка використовується для внутрішнього перетворення з числа в рядок і ініціалізована в "%.6g".
Явні перетворення типів можуть бути примусовими, експр "" є рядком і експр+0 є числовим.

Оцінювати, експр1 повторний опер експр2, якщо обидва операнди є числовими або числово-рядковими, то
порівняння числове; якщо обидва операнди є рядковими, порівняння є рядковим; якщо один
операнд – це рядок, нерядковий операнд перетворюється, а порівняння – рядковий. The
результат - числовий, 1 або 0.

У логічних контекстах, таких як, if ( експр ) заяву, рядковий вираз оцінює значення true if
і тільки якщо це не порожній рядок ""; числові значення тоді і тільки тоді, коли не числові
нуль.

3. регулярний вирази
У мові AWK записи, поля та рядки часто перевіряються на відповідність a регулярний
вираз. Регулярні вирази укладаються в косі риски і

експр ~ /r/

є виразом AWK, який оцінюється як 1 if експр "сірники" r, що означає підрядок
експр знаходиться в наборі рядків, визначених r. Якщо немає відповідності, вираз має значення 0;
заміна ~ оператором "не збігається" !~ змінює значення. Як шаблон-дія
пари,

/r/ { дію } і $0 ~ /r/ { дію }

однакові і для кожного вхідного запису, який відповідає r, дію виконується. Фактично, /r/
є виразом AWK, еквівалентним ($0 ~ /r/) будь-де, окрім коли справа
стороні оператора відповідності або передається як аргумент вбудованій функції, яка очікує a
аргумент регулярного виразу.

AWK використовує розширені регулярні вирази, як і with егреп(1). Регулярний вираз
метасимволи, тобто такі, що мають особливе значення в регулярних виразах

^ $ . [ ] | ( ) * + ?

Регулярні вирази будуються із символів таким чином:

c відповідає будь-якому неметасимволу c.

\c відповідає символу, визначеному тими ж керуючими послідовностями, що використовуються в
рядкові константи або літеральний символ c якщо \c це не втеча
послідовність.

. відповідає будь-якому символу (включаючи новий рядок).

^ відповідає передній частині рядка.

$ відповідає зворотній стороні рядка.

[c1c2c3...] відповідає будь-якому символу в класі c1c2c3... . Інтервал з
символи позначаються c1-c2 всередині класу [...].

[^c1c2c3...] відповідає будь-якому символу не в класі c1c2c3...

Регулярні вирази будуються з інших регулярних виразів таким чином:

r1r2 матчі r1, а потім одразу r2 (конкатенація).

r1 | r2 матчі r1 або r2 (чергування).

r* сірники r повторюється нуль або більше разів.

r+ сірники r повторюється один або кілька разів.

r? сірники r нуль або один раз.

(r) збігів r, забезпечуючи групування.

Зростаючий пріоритет операторів - це чергування, конкатенація та унарність (*, + або
?).

Наприклад,

/^[_a-zA-Z][_a-zA-Z0-9]*$/ і
/^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/

відповідають ідентифікаторам AWK та числовим константам AWK відповідно. Зауважте, що . має
escaped, щоб розпізнаватися як десяткова кома, а метасимволи не є особливими
всередині класів персонажів.

Будь-який вираз можна використовувати в правій частині операторів ~ або !~ або передавати до a
вбудований, який очікує регулярний вираз. Якщо потрібно, він перетворюється в рядок і
потім інтерпретується як регулярний вираз. Наприклад,

BEGIN { identifier = "[_a-zA-Z][_a-zA-Z0-9]*" }

$0 ~ ідентифікатор "^".

друкує всі рядки, які починаються з ідентифікатора AWK.

mawk розпізнає порожній регулярний вираз //, який відповідає порожньому рядку, а отже
відповідає будь-якому рядку спереду, ззаду та між кожним символом. Наприклад,

луна abc | mawk { gsub(//, "X") ; друкувати }
XaXbXcX

4. Records і поля
Записи зчитуються по одному та зберігаються в поле змінна $0. Рекорд є
розділити на поля які зберігаються в $1, $2, ..., $NF. Вбудована змінна NF встановлений
до кількості полів і NR і FNR збільшуються на 1. Поля вище $NF встановлено на
"".

Призначення до $0 викликає поля і NF підлягає перерахуванню. Призначення до NF або до а
польові причини $0 відновити шляхом конкатенації $i відокремлений ОФС.
Призначення полю з індексом більше ніж NF, збільшується NF і причини $0 бути
реконструйовано.

Дані, що зберігаються в полях, є рядковими, якщо все поле не має числову форму, а потім
тип - число і рядок. Наприклад,

луна 24 24E |
mawk '{ print($1>100, $1>"100", $2>100, $2>"100") }'
0 1 1 1

$0 і $2 є рядок і $1 є числом і рядком. Перше порівняння — числове,
другий рядок, третій рядок (100 перетворюється на "100"), останній рядок.

5. Вирази і Оператори
Синтаксис виразу схожий на C. Основні вирази — числові константи, рядок
константи, змінні, поля, масиви та виклики функцій. Ідентифікатор змінної,
Масив або функція може бути послідовністю літер, цифр і символів підкреслення, що ні
почати з цифри. Змінні не оголошуються; вони існують при першому посиланні і є
ініціалізовано до нулю.

Нові вирази складаються з наступними операторами в порядку зростання
пріоритет.

призначення = += -= *= /= %= ^=
умовний ? :
логічний or ||
логічний і &&
масив членство in
узгодження ~ !~
реляційні < > <= >= == !=
конкатенація (без явного оператора)
додавати опс + -
мул опс * /%
одинарний + -
логічний НЕ !
підведення в ступінь ^
вкл і грудня ++ -- (як пост, так і попередній)
поле $

Присвоєння, умова та підведення до степеня асоціюються справа наліво; інші оператори
асоціювати зліва направо. Будь-який вираз можна взяти в дужки.

6. Масиви
Awk надає одновимірні масиви. Елементи масиву виражаються як масив[експр]. Вираз
внутрішньо перетворюється на рядковий тип, тому, наприклад, A[1] і A["1"] однакові
елемент, а фактичний індекс — «1». Масиви, індексовані рядками, називаються асоціативними
масиви. Спочатку масив порожній; елементи існують при першому доступі. вираз,
експр in масив оцінюється як 1, якщо масив[експр] існує, інакше до 0.

Існує форма та цінності оператор, який зациклює кожен індекс масиву.

та цінності ( було in масив ) заяву

Набори було до кожного індексу масив і виконує заяву. Наказ, що було поперечні
індекси масив не визначено.

Заява, видаляти масив[експр], причини масив[експр] не існувати. mawk підтримує
розширення, видаляти масив, який видаляє всі елементи масив.

Багатовимірні масиви синтезуються за допомогою конкатенації за допомогою вбудованої змінної
SUBSEP. масив[експр1,експр2] еквівалентно масив[експр1 SUBSEP експр2]. Тестування на а
багатовимірний елемент використовує індекс у дужках, наприклад

якщо ( (i, j) в A ) надрукувати A[i, j]

7. Вбудовані змінні
Наступні змінні вбудовуються та ініціалізуються перед виконанням програми.

ARGC кількість аргументів командного рядка.

ARGV масив аргументів командного рядка, 0..ARGC-1.

CONVFMT формат внутрішнього перетворення чисел у рядок, початково = "%.6g".

СЕРЕДОВИЩЕ масив, індексований змінними середовища. рядок середовища, var=значення
зберігається як СЕРЕДОВИЩЕ[було] = значення.

ФІЛЕНАМ ім'я поточного вхідного файлу.

FNR номер поточного запису в ФІЛЕНАМ.

FS розбиває записи на поля як регулярний вираз.

NF кількість полів у поточному записі.

NR номер поточного запису в загальному вхідному потоці.

OFMT формат для друку чисел; спочатку = "%.6g".

ОФС вставляється між полями на виводі, спочатку = " ".

ОРС завершує кожен запис на виході, спочатку = "\n".

ДОВЖИНА довжина, встановлена ​​останнім викликом вбудованої функції, матч ().

RS вхідний роздільник запису, спочатку = "\n".

RSTART індекс, встановлений останнім викликом до матч ().

SUBSEP використовується для створення кількох індексів масиву, спочатку = "\034".

8. Вбудований Функції
Рядкові функції

gsub(r,s,t) gsub(r,s)
Глобальна підстановка, кожен збіг регулярного виразу r у змінному t is
замінено на рядок s. Повертається кількість замін. Якщо t is
пропущено, $0 використовується. & у рядку заміни s замінюється на
відповідний підрядок t. \& і \\ поставте літерали & і \ відповідно в
рядок заміни.

індекс (s,t)
If t є підрядком s, потім положення де t starts повертається, інакше
Повертається 0. Перший персонаж s знаходиться в позиції 1.

довжина(s)
Повертає довжину рядка s.

відповідати (s,r)
Повертає індекс першого найдовшого збігу регулярного виразу r in
рядок s. Повертає 0, якщо немає збігу. Як побічний ефект, RSTART встановлено на
повертається значення. ДОВЖИНА встановлюється на довжину збігу або -1, якщо немає збігу.
Якщо порожній рядок збігається, ДОВЖИНА встановлюється на 0, а 1 повертається, якщо
сірник знаходиться спереду і довжина(s)+1 повертається, якщо збіг о
спина.

розділити (s,A,r) розділити (с, А)
рядок s розбивається на поля за допомогою регулярного виразу r а поля є
завантажується в масив A. Повертається кількість полів. Дивіться розділ 11
нижче для більш детальної інформації. Якщо r пропущено, FS використовується.

Sprintf (format,expr-list)
Повертає рядок, створений з expr-список відповідно до формат. Дивіться
опис printf() нижче.

під(r,s,t) sub(r,s)
Одиночна заміна, як і gsub(), за винятком щонайбільше однієї заміни.

substr(s,i,n) substr(s, i)
Повертає підрядок рядка s, починаючи з індексу i, довжини n. Якщо n
опущено, суфікс о s, починаючи з i повертається

знизити(s)
Повертає копію s з усіма символами верхнього регістру, перетвореними на нижні.

топ (s)
Повертає копію s з перетворенням усіх символів нижнього регістру у верхній регістр.

Арифметичні функції

atan2(y,x) Арктан з y/x між -pi і pi.

cos (x) функція косинуса, x в радіанах.

досвід (x) Показова функція.

int(x) Повертає x зрізаний до нуля.

журнал (x) Натуральний логарифм.

rand() Повертає випадкове число від нуля до одиниці.

гріх (x) Функція синуса, x в радіанах.

sqrt(x) Повертає квадратний корінь з x.

Сранд(експр) srand()
Насіває генератор випадкових чисел, використовуючи годинник if експр опущено, і
повертає значення попереднього насіння. mawk насіння випадкове число
генератор від годинника при запуску, тому немає реальної необхідності викликати
srand(). Сранд(експр) корисно для повторення псевдовипадкових послідовностей.

9. вхід і вихід
Є два вихідні заяви, друк і printf.

print пише $0 ОРС на стандартний вихід.

друк експр1, експр2, ..., експрn
пише експр1 ОФС експр2 ОФС ... експрn ОРС на стандартний вихід. числові
вирази перетворюються на рядок with OFMT.

printf формат, expr-список
дублює функцію бібліотеки printf C, що записує у стандартний вихід. The
повні специфікації формату ANSI C розпізнаються з перетвореннями %c,
%d, %e, %E, %f, %g, %G, %i, %o, %s, %u, %x, %X та %%, і перетворення
кваліфікаційні h і l.

Список аргументів для print або printf можна за бажанням узяти в дужки. Друк
форматує числа за допомогою OFMT або "%d" для точних цілих чисел. "%c" з числовим аргументом
друкує відповідний 8-бітовий символ, з аргументом рядка друкує перший
символ рядка. Результати print і printf можна перенаправити до файлу або
команду, додавши > файл, >> файл або | команда до кінця оператора друку.
Відкривається перенаправлення файл or команда лише один раз, наступні переспрямування додаються до вже
відкритий потік. За домовленістю, mawk пов'язує ім'я файлу "/dev/stderr" з stderr який
дозволяє print і printf перенаправляти на stderr. mawk також соратники «-» і
"/dev/stdout" з stdin і stdout, що дозволяє передавати ці потоки до функцій.

Функція введення getline має наступні варіації.

getline
читає в $0, оновлює поля, NF, NR і FNR.

getline файл
читає в $0 від файл, оновлює поля та NF.

getline було
читає наступний запис було, оновлення NR і FNR.

getline було < файл
читає наступний запис файл в було.

команда | getline
труби запис з команда в $0 і оновлює поля та NF.

команда | getline було
труби запис з команда в було.

Getline повертає 0 в кінці файлу, -1 у разі помилки, інакше 1.

Команди на кінці каналів виконуються за допомогою /bin/sh.

Функція близько(експр) закриває файл або канал, пов’язаний з експр. Close повертає 0 if
експр є відкритим файлом, статус виходу if експр є командою з конвейером, а в іншому випадку -1. Закрити
використовується для повторного читання файлу або команди, переконайтеся, що інший кінець вихідного каналу закінчено
або заощадити ресурси файлів.

Функція змити(експр) очищує вихідний файл або канал, пов’язаний з експр. Змивати
повертає 0, якщо експр є відкритим вихідним потоком else -1. Флеш без аргументу флеш
стандартний вихід. Fflush з порожнім аргументом ("") очищає весь відкритий вихід.

Функція система(експр) використовує / Бен / ш виконати експр і повертає статус виходу
команда експр. Зміни, внесені до СЕРЕДОВИЩЕ масив не передається командам, що виконуються за допомогою
система або труби.

10. користувач певний Функції
Синтаксис визначеної користувачем функції такий

функція ім'я( аргументи ) { заяви }

Тіло функції може містити оператор return

повертати opt_expr

Заява про повернення не потрібна. Виклики функцій можуть бути вкладеними або рекурсивними. Функції
передаються вирази за значенням і масиви за посиланням. Додаткові аргументи служать локальними
змінні та ініціалізуються до нулю. Наприклад, csplit(с, А) ставить кожен символ s
в масив A і повертає довжину s.

функція csplit(s, A, n, i)
{
n = довжина(и)
for( i = 1 ; i <= n ; i++ ) A[i] = substr(s, i, 1)
повернути н
}

Розміщення додаткового простору між переданими аргументами та локальними змінними є звичайним.
На функції можна посилатися до їх визначення, але ім’я функції та '(')
аргументи повинні торкатися, щоб уникнути плутанини з конкатенацією.

11. Розщеплення струни, облік і файли
Програми Awk використовують той самий алгоритм для поділу рядків на масиви за допомогою split() і записів
в поля на FS. mawk використовує по суті той самий алгоритм для поділу файлів на записи
on RS.

розділити(вираз, А, вер) працює наступним чином:

(1) Якщо Вересень пропущено, його замінено на FS. Вересень може бути виразом або
регулярний вираз. Якщо це вираз не рядкового типу, це так
перетворюється на рядок.

(2) Якщо Вересень = " " (один пробіл), то оброблений спереду і
задній частині експр, і Вересень стає . mawk визначає як звичайний
вираз /[ \t\n]+/. Інакше Вересень розглядається як регулярний вираз,
за винятком того, що метасимволи ігноруються для рядка довжиною 1, наприклад,
split(x, A, "*") і split(x, A, /\*/) однакові.

(3) Якщо експр не є рядком, він перетворюється на рядок. Якщо експр тоді порожній
рядок "", split() повертає 0 і A встановлено порожнім. В іншому випадку всі не-
перекриваються, ненульові та найдовші збіги Вересень in експр, окремо експр в
поля, в які завантажуються A. Поля розміщуються в A[1], A[2], ...,
A[n] і split() повертають n, кількість полів, яка є кількістю
сірники плюс один. Дані розміщені в A що виглядає числовим, є введеним числом і
рядок.

Розбиття записів на поля працює так само, за винятком завантаження фрагментів $1, $2, ...,
$NF. Якщо $0 пусто, NF встановлено на 0 і все $i до "".

mawk розбиває файли на записи за тим же алгоритмом, але з невеликою різницею
RS насправді це термінатор, а не роздільник. (ОРС дійсно термінатор).

Наприклад, якщо FS = ":+" і $0 = "a::b:" , тоді NF = 3 і $1 = "а", $2 = "b" і $3 =
"", але якщо "a::b:" є вмістом вхідного файлу і RS = ":+", то є
два записи «а» і «б».

RS = " " не є особливим.

If FS = "", то mawk розбиває запис на окремі символи, і, подібним чином,
розділити (s,A,"") розміщує окремі символи s в A.

12. Багаторядковий облік
З mawk інтерпретує RS як регулярний вираз, багаторядкові записи прості. Налаштування RS
= "\n\n+", робить один або кілька порожніх рядків окремими записами. Якщо FS = " " (за замовчуванням),
потім одиничний новий рядок за правилами для вище, стають пробілом, а одиничними новими рядками
роздільники полів.

Наприклад, якщо файл "ab\nc\n\n", RS = "\n\n+" і FS = " ", то є
один запис "ab\nc" з трьома полями "a", "b" і "c". Змінюється FS = "\n", дає
два поля «ab» і «c»; змінюється FS = "", дає одне поле, ідентичне
запис.

Якщо ви хочете, щоб рядки з пробілами або табуляції вважалися пустими, установіть RS = "\n([ \t]*\n)+".
Для сумісності з іншими awks, налаштування RS = "" має такий самий ефект, як і пусті рядки
видаляються з передньої та задньої сторін файлів, а потім записи визначаються як би RS =
"\n\n+". Posix вимагає, щоб "\n" завжди розділяла записи, коли RS = "" незалежно від
Значення FS. mawk не підтримує цю конвенцію, оскільки визначення "\n" як
робить це непотрібним.

Найчастіше, коли ви змінюєтеся RS для багаторядкових записів ви також захочете змінити
ОРС до "\n\n", щоб інтервал записів зберігався на виводі.

13. програма виконання
У цьому розділі описується порядок виконання програми. Спочатку ARGC встановлюється на загальну суму
кількість аргументів командного рядка, переданих на етапі виконання програми. ARGV[0] is
встановіть назву інтерпретатора AWK і ARGV[1] ... ARGV[ARGC-1] утримує решту
аргументи командного рядка без параметрів і джерела програми. Наприклад с

mawk -f prog v=1 A t=привіт B

ARGC = 5 с ARGV[0] = "маук", ARGV[1] = "v=1", ARGV[2] = "А", ARGV[3] = "t=привіт" і
ARGV[4] = "В".

Далі кожен ПОЧАТИ блок виконується по порядку. Якщо програма повністю складається з ПОЧАТИ
блоків, то виконання припиняється, інакше відкривається вхідний потік і виконання продовжується.
If ARGC дорівнює 1, вхідний потік має значення stdin, інакше аргументи командного рядка
ARGV[1] ... ARGV[ARGC-1] перевіряються на наявність аргументу файлу.

Аргументи командного рядка поділяються на три набори: аргументи файлу, аргументи присвоєння
і порожні рядки "". Завдання має форму було=рядок. Коли an ARGV[i] обстежується
як можливий аргумент файлу, якщо він порожній, він пропускається; якщо це завдання
аргумент, завдання до було відбувається і i переходить до наступного аргументу; інше ARGV[i]
відкривається для введення. Якщо він не відкривається, виконання завершується з кодом виходу 2. Якщо ні
Аргумент командного рядка є аргументом файлу, тоді вхід надходить із стандартного входу. Отримати лінію в a ПОЧАТИ
дія відкриває вхід. "-" як аргумент файлу позначає stdin.

Як тільки вхідний потік відкритий, кожен вхідний запис перевіряється для кожного модель, і якщо це
збіги, пов’язані дію виконується. Шаблон виразу відповідає, якщо він є
boolean true (див. кінець розділу 2). А ПОЧАТИ шаблон збігається перед будь-яким введенням
було прочитано, і an END шаблон збігається після прочитання всіх введених даних. Шаблон діапазону,
експр1,експр2 , відповідає кожному запису між матчами експр1 і матч експр2
включно.

Коли кінець файлу відбувається у вхідному потоці, залишаються аргументи командного рядка
перевіряється на наявність аргументу файлу, і якщо він є, він відкривається, інакше END модель is
вважається відповідним і все END дії виконуються.

У прикладі присвоєння v=1 має місце після ПОЧАТИ дії виконуються, і
дані, розміщені в v, є числом і рядком. Потім вхідні дані зчитуються з файлу A. Наприкінці
файлу A, t встановлюється на рядок "hello", а B відкривається для введення. В кінці файлу B,
la END дії виконуються.

Хід програми на модель {дія} рівень можна змінити за допомогою

наступний
вихід opt_expr

заяви. А. наступний оператор викликає читання наступного вхідного запису та тестування шаблону
щоб перезапустити з першого модель {дія} пара в програмі. An вихід твердження причини
негайне виконання END дії або припинення програми, якщо їх немає або якщо
вихід відбувається в an END дії. The opt_expr встановлює значення виходу з програми, якщо
замінено пізніше вихід або подальша помилка.

ПРИКЛАДИ


1. наслідувати коту.

{друк}

2. наслідувати wc.

{ chars += length($0) + 1 # додати один для \n
слова += НФ
}

END{ print NR, слова, символи }

3. підрахувати кількість унікальних «справжніх слів».

BEGIN { FS = "[^A-Za-z]+" }

{ for(i = 1 ; i <= NF ; i++) word[$i] = "" }

END { видалити слово[""]
for (i в слові) cnt++
друкувати cnt
}

4. підсумуйте друге поле кожного запису на основі першого поля.

$1 ~ /кредит|прибуток/ { сума += $2 }
$1 ~ /дебет|збиток/ {сума -= $2}

END {друк суми}

5. відсортувати файл, порівнявши як рядок

{ line[NR] = $0 "" } # переконайтеся, що тип порівняння
# у випадку, якщо деякі рядки виглядають числовими

END { isort(рядок, NR)
for(i = 1 ; i <= NR ; i++) надрукувати рядок[i]
}

#insertion сорт A[1..n]
функція isort( A, n, i, j, утримуйте)
{
for( i = 2 ; i <= n ; i++)
{
утримувати = A[j = i]
поки ( A[j-1] > утримуйте )
{ j-- ; A[j+1] = A[j] }
A[j] = утримуйте
}
# сторожовий A[0] = "" буде створено, якщо потрібно
}

СУМІСНІСТЬ ПИТАННЯ


Визначення мови AWK у Posix 1003.2 (проект 11.3) - це AWK, як описано в AWK.
книга з кількома розширеннями, які з'явилися в SystemVR4 nawk. Розширення:

Нові функції: toupper() і tolower().

Нові змінні: ENVIRON[] і CONVFMT.

Специфікації перетворення ANSI C для printf() і sprintf().

Нові параметри команди: -v вар=значення, кілька параметрів -f та параметри реалізації
як аргументи до -W.

Posix AWK орієнтований на роботу з файлами по рядку. RS можна змінити з "\n"
до іншого окремого символу, але цьому важко знайти застосування — немає
приклади в книзі AWK. За домовленістю, RS = "", відокремлює один або кілька порожніх рядків
записів, що дозволяє багаторядкові записи. Коли RS = "", "\n" завжди є роздільником полів
незалежно від значення в FS.

mawk, з іншого боку, дозволяє RS бути регулярним виразом. Коли "\n" з'являється в
записів, він розглядається як простір, і FS завжди визначає поля.

Видалення парадигми рядка за часом може спростити деякі програми і часто їх покращити
продуктивність. Наприклад, повторивши приклад 3 зверху,

ПОЧАТОК { RS = "[^A-Za-z]+" }

{ слово [ $0 ] = "" }

END { видалити слово [ "" ]
for( i в слові ) cnt++
друкувати cnt
}

підраховує кількість унікальних слів, роблячи кожне слово записом. Для файлів середнього розміру,
mawk виконується вдвічі швидше через спрощений внутрішній цикл.

Наступна програма замінює кожен коментар на один пробіл у програмному файлі C,

ПОЧАТИ {
RS = "/\*([^*]|\*+[^/*])*\*+/"
# коментар є роздільником записів
ORS = " "
отримати лінію утримання
}

{ утримування друку; утримувати = $0 }

END { printf "%s" , утримуйте }

Буферизація одного запису потрібна, щоб уникнути завершення останнього запису пробілом.

з mawk, всі наступні є еквівалентними,

x ~ /a\+b/ x ~ "a\+b" x ~ "a\\+b"

Рядки скануються двічі, один раз як рядок і один раз як регулярний вираз. На
сканування рядків, mawk ігнорує escape для символів, що не відображаються, тоді як книга AWK підтримує
\c бути визнаним як c що вимагає подвійного екранування метасимволів у
струни. Posix явно відмовляється визначати поведінку, яка пасивно змушує програми
який повинен працювати під різними awks, щоб використовувати більш портативний, але менш читабельний, double
Втеча.

Posix AWK не розпізнає "/dev/std{out,err}" або \x шістнадцяткові escape-послідовності в рядках.
На відміну від ANSI C, mawk обмежує кількість цифр, що слідують за \x, до двох як поточного
реалізація підтримує лише 8-бітові символи. Вбудований змити вперше з'явився в а
нещодавно (1993) AT&T awk випущено в netlib і не є частиною стандарту posix.
Сукупне видалення з видаляти масив не є частиною стандарту posix.

Posix явно залишає поведінку FS = "" undefined і згадує розділення
запис у символи як можливу інтерпретацію, але наразі це не використовується
переносимість у різних реалізаціях.

Нарешті, ось як mawk обробляє виняткові випадки, не обговорені в книзі AWK або
Проект Posix. Небезпечно припускати узгодженість між awks і безпечно переходити до наступного
.

substr(s, i, n) повертає символи s на перетині замкнутого
інтервал [1, довжина(и)] і напіввідкритий інтервал [i, i+n). Коли це
перетин порожній, повертається порожній рядок; тому substr("ABC", 1, 0) = ""
і substr("ABC", -4, 6) = "A".

Кожен рядок, включаючи порожній рядок, відповідає порожньому рядку спереду, тому,
s ~ // і s ~ "", завжди дорівнюють 1, як і match(s, //) і match(s, ""). Останні два
комплект ДОВЖИНА в 0.

індекс(и, t) завжди той самий, що й відповідність(и, t1), де t1 такий самий, як t із
метасимволи втекли. Отже, узгодженість із відповідністю вимагає, щоб індекс(и, "")
завжди повертає 1. Також умова, index(s,t) != 0, якщо і тільки t є підрядком
з s, вимагає індекс("","") = 1.

Якщо getline зустрічає кінець файлу, getline var залишає var без змін. так само,
при вході в END дії, $0, поля і NF мають свою цінність без змін
останній запис.

Використовуйте mawk онлайн за допомогою служб onworks.net


Ad


Ad

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