Мова обробки даних AWK, Unix, Операційні системи, статті

Галина О. В., Суперкомп’ютерний Центр

Зміст


Part: Загальна інформація

1. Призначення і Формат використання


AWK – Утиліта призначена для простих, механічних і обчислювальних маніпуляцій над даними. Досить нескладні операції часто необхідно виконати над цілими пакетами файлів, а писати для цього програму на одному із стандартних мов програмування є виснажливим і, як правило, не дуже простою справою. Оптимальне рішення проблеми – використання спеціальної утиліти AWK, Що включає в себе не громіздкий і зручний мова програмування, що дозволяє вирішувати завдання обробки даних за допомогою коротких програм, що складаються з двох-трьох рядків.

Утиліта AWK спочатку об’єднувала властивості утиліт UNIX sed і grep. Надалі її можливості значно розширилися. Ця документація обмежується описом можливостей утиліти AWK реалізованої для комп’ютерів CONVEX. Утиліта AWK була створена в 1977р, американськими авторами: Alfred V.Aho, Brian W.Kernighan і Peter J.Weinberger. Детальний опис всіх можливостей утиліти AWK для UNIX дає їх видання: “ The AWK Programming Language”, 1988.

AWK сканує input (Стандартний або вказується набір файлів), і над рядками, що задовольняють заданим зразком, виконує вказані дії. Рядок може містити максимально до 256 символів.

Формат:

awk [-Fc] [-f file] [files]

awk [-Fc] [prog] [files]

prog – Програма, виду: зразок $ {$ дію $} $

file – Файл з AWK-програмою:

зразок { дію}

зразок { дію}


files – Файли, призначені для AWK-обробки.

-Fc – Встановлює роздільник полів в “ з” (Див. 1.2.1 і 2.4)

2. Загальна структура AWK-програми

1. Мова програмування AWK допускає використання:


2. Зразок:


3. Дія:


Пропозиція:


  1. Висновок (Друк);
  2. Присвоєння;
  3. Вбудована функція;
  4. Керуюча структура.

Part: Структура AWK-програми

1. Мова AWK

1.1 Поля

Кожна сканована рядок input розглядається як складається з полів, розділених розділовими символами (за замовчуванням – пробіл).

На поля можна посилатися з AWK програми наступним чином:


  1. $1 – Перше поле;
  2. $2 – Друге поле;
  3. … і так далі …
  4. $0 – Посилається на весь рядок цілком.

Рядок може містити максимально до 100 полів.

1.2 Змінні

1.2.1 Стандартні змінні


&lt Drawing or tabular insertion skipped…&gt

1.2.2 Значення змінних

Змінні можуть інтерпретуватися як числові або рядкові. Вони приймають значення в залежності від контексту, наприклад:

x = 1, x сприймається як число;

x = ” “, x – Рядок;

x + “abc” – Результат операції інтерпретується як число незалежно від того, чи було х числом або рядком. Якщо рядок не може бути інтерпретована як число (“abc”), То її значення стає 0.

Рядок може містити максимально до 256 символів.

1.2.3 Змінні поля

Посилання на поля $1, $2, … можуть інтерпретуватися як змінних, наприклад:

$1 = “3” + $2 – Перше поле приймає значення другого поля, збільшеного на 3.

$(i+1) – Інтерпретується як поле, номер якого залежить від значення змінної i.

1.2.4 Масиви

Допускається використання масивів. Масиви не оголошуються, а приймають значення з контексту, наприклад:

x[NR] = $0 – Елементу масиву x, Індексованих NR, Присвоюється оброблювана рядок.

x[“apple”] – Елементи масиву можуть індексуватися не числовим значенням, тобто рядком.

1.3 Арифметичні вираження

Вираз:


&lt Операція&gt : “+”, “-“, “*”, “/”, “%”

2. Зразки / patterns /

2.1 Регулярний вираз

Для здійснення пошуку в AWK мовою допускається використання регулярних виразів, визначених в описі SED, (див. “ Неінтерактивний текстовий редактор SED” 2.1) ув’язнених в “/ /”. Додатки до використання регулярних виразів, що допускаються в AWK-мові:



Наприклад:

/Olga/ – Вказує на рядки, що містять Olga.

/[Oo]lga|[Mm]ike|[Mm]al/ – Вказує на рядки, що містять Olga або olga або Mike або mike або Mal або mal.

/number[0-9]/ – Вказує на рядки, що містять number0 або number1 або … number9.

/\/.+\// – Вказує на рядки, що містять будь-яка кількість символів, більше або рівне 1, укладених в / /.

2.2 Вираз відносини

Вираз відношення може бути двох типів:


Приналежність:

~ – Міститься;

!~ – Не міститься.

Лог. Операція: &lt , &lt =, ==, !=, &gt =, &gt .

Наприклад:

$1 ~ /[Oo]lga/ – Вказує на рядки, перше поле яких містить Olga або olga.

$1 &gt = “s” – Вказує на рядки, що починаються з символу s або наступних за ним по порядку: t, u, v


2.3 Комбінація зразків

Допускається логічна комбінація зразків з використанням наступних знаків: || – “ Або”, &amp &amp – “ І”, ! – “ Не”.

Послідовності зразків, з’єднаних одним із знаків читаються зліва направо.

Комбінація: “ образец1, образец2” вказує, що дія виконується над рядками, що потрапляють в зазначений ранг: тобто, починаючи з рядка, що задовольняє “ образец1 “і аж до рядка, що задовольняє “ Образец2 “, включаючи її саму.

Наприклад:

/02\.95/ &amp &amp ($1 !~ /\.su/ $2 !~ /\.su/) – Вказує на рядки, що містять 02.95 і не мають .su одночасно в першому і в другому полі.

NR == 100, NR == 200 – Вказує рядки з номерами від 100 до 200.

2.4 BEGIN і END

Зразок BEGIN вказує на початок input або на ті дії, які повинні бути виконані до якого б то не було аналізу рядків. Зразок END вказує на кінець input або на ті дії, які повинні бути виконані після обробки всіх рядків.

Наприклад:

BEGIN {FS = “:”} – Встановлює роздільник полів в “:” до початку обробки рядків. Еквівалентно опції “-F:” при AWK виклику.

END { print NR } – Друкує номер останнього рядка input, Тобто кількість оброблених вхідних рядків.


3. Дії

3.1 Висновок / Друк /

Формат оператора друку:

PRINT [&lt список виразів&gt ] [ &gt &lt вираз1&gt ]

Якщо в списку вираження знаходяться через кому, то значення цих виразів виводяться на output (Друкуються) через символ-роздільник OFS (За замовчуванням пробіл). Якщо ж вирази стоять через пробіл, то на печатці відбувається їх конкатенація.

Значення &lt вираженія1&gt розглядається як ім’я файлу. Саме його присутність означає друк у файл. Якщо замість “&gt ” Стоїть “&gt &gt ”, То це означає додаток до вже існуючого файлу. Можна використовувати в одній програмі максимально до 10 output файлів.

Оператор форматованої друку:

PRINTF формат [, Список виразів] [ &gt вираз1]

формат: символьний рядок в подвійних лапках. Ідентичний формату, що використовується у функції printf в мові “ С”. Формат може містити:


3.2 Присвоєння

Оператор присвоювання має вигляд:

&lt змінна&gt = &lt вираз&gt

Початкове значення змінної 0 або “” (пропуск). Допускаються інші типи присвоювання відповідно до мови “ С”: “+=”,“-=”,“*=”,“/=”,“%=”.

&lt змінна&gt ++, ++&lt змінна&gt – Збільшення значення змінної на 1.

&lt змінна&gt —, –&lt змінна&gt – Зменшення значення змінної на 1.

3.3 Вбудовані функції

length(arg) – Функція довжини arg. Якщо arg не зазначений, то видає довжину поточного рядка.

exp(),log(),sqrt() – Математичні функції експонента, логарифм і квадратний корінь.

int() – Функція цілої частини числа.

substr(s,m,n) – Повертає підрядок рядка s, Починаючи з позиції m, Всього n символів.

index(s,t) – Повертає початкову позицію підрядка t в рядку s. (Або 0, якщо t в s не міститься.)

sprintf(fmt,exp1,exp2,…) – Здійснює форматований друк (висновок) в рядок, ідентично PRINTF.

split(s,array,sep) – Поміщає поля рядка s в масив array і повертає число заповнених елементів масиву. Якщо зазначений sep, То при аналізі рядка він розуміється як роздільник.

3.4 Керуючі структури

Умовне пропозиція:

if ( &lt умова&gt ) &lt пропозицію&gt

\hskip 1cm [else &lt пропозицію&gt ]

Пропозиції циклу:

while ( &lt умова&gt ) &lt пропозицію&gt

for (&lt вираз&gt ; &lt умова&gt ; &lt вираз&gt )

\hskip 1cm &lt пропозицію&gt

Наприклад:

for(i=1; i&lt =NF; i++) – Аналогічно циклу for у мові “ З”

for (i in array) – Цикл за елементами масиву. Але, елементи масиву доступні в цьому випадку у випадковому порядку.

break – Негайний вихід з циклу.

continue – Перехід до виконання наступного пропозиції.

next – Негайне перехід до аналізу наступного рядка.

exit – Вихід з програми (на кінець input).

# – Коментар

Part: Порівняльне рішення задач за допомогою SED і AWK

Система UNIX володіє декількома програмами, які обробляють вхідний потік даних: grep, egrep, fgrep, lex і sed. Неінтерактивний редактор sed забезпечує виконання в пакетному режимі більшості функцій редагування редактора ed. Як показано на прикладах нижче, деякі завдання обробки текстів можуть бути вирішені як за допомогою awk, Так і за допомогою sed і час вирішення простих задач за допомогою sed буде менше. Однак, рішення деяких прикладів (як +4. І 5.) Виглядають більш наочно з використанням awk. Крім того, утиліта awk безумовно ширше за своїми можливостями і дозволяє чисельні маніпуляції з даними, логічні відносини, використання змінних і т.п., чого не забезпечує жодна з перерахованих вище програм.

Приклади:

1. Порахувати кількість рядків (input)

SED: $= (10.2 c.)

AWK: END { PRINT NR } (15.0 c.)

2. Надрукувати всі рядки, які містять “olga”

SED: /olga/p (11.6 c.)

AWK: /olga/ (25.6 c.)

3. Надрукувати всі рядки, які містять “olga”, “mike” або “mal”



SED: /olga/p
/olga/d
/mike/p
/mike/d
/mal/p
/mal/d (15.8 c.)
AWK: /olga\bverb mike\everb mal/ (29.9 c.)

4. Надрукувати третє поле кожного рядка

SED: /[^ ]* [ ]*[^ ]* [ ]*\([^ ]*\).*/s//\1/p (29.0 c.)

AWK: {PRINT $3} (33.3 c.)

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

SED: /[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\).*/s//\2\1/p (30.5 c.)

AWK: {PRINT $3 $2} (38.9 c.)

6. Додати рядки, які містять “olga”, “mike” або “mal” відповідно до файлів: folga, fmike, fmal




SED: /olga/w folga
/mike/w fmike
/mal/w fmal (16.1 c.)
AWK: /olga/ {print &gt “folga”}
/mike/ {print &gt “fmike”}
/mal/ {print &gt “fmal”} (46.4 c.)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*