- •Лабораторна робота 3
- •Базові регулярні вираження
- •Метасимволы, використовувані в регулярних вираженнях
- •Приклади регулярних виражень
- •Приклад виконання лабораторної роботи n3 Завдання 1
- •Завдання 2
- •Завдання 3
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Вибрані команди Unix. Короткий опис:
- •Приклад виконання лабораторної роботи n4 Завдання 1
- •Завдання 1, варіант 1
- •Завдання 1, варіант 2
- •Завдання 1, варіант 3
- •Завдання 2
- •Завдання 2 варіант 1
- •Завдання 2, варіант 2
- •Завдання 2, варіант 3
- •Завдання 3
- •Завдання 3 варіант 1
- •Завдання 3 варіант 2
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Команда awk :
- •Опис шаблонів
- •Приклад виконання лабораторної роботи n5 Приклад 1-1
- •Приклад 1-2
- •Приклад 1-3
- •Приклад 2-3.1
- •Приклад 2-3.2
- •Приклад 2-3.3
- •Приклад 2-3.4
- •Варіанти індивідуальних завдань
- •Команда sh:
- •Команда env:
- •Приклад виконання лабораторної роботи n6
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Деякі приклади програмування
- •Приклад 2
- •Приклад 3
- •Варіанти індивідуальних завдань
Приклад 2-3.3
У файлі query2 визначити покупця, який має максимальну цифру номера будинку.
Розв'язок задоволений простої, сам алгоритм пошуку максимуму не представляє інтересу, оборотний увага на роботу з номером будинку. Аналіз файлу query2 показує, що адреса є третім полем у файлі, а номер будинку (якщо він присутній) - завжди перше слово в адресі. Однак не у всіх адресах зазначений номер будинку, адреси без цієї складової можна просто виключити з обробки. Це можна зробити за допомогою шаблону. Номер будинку виділяється з адреси при помрщи функції split(), роздільником слів в адресі є пробіл.
Повний текст програми awk і протокол її виконання виглядає так:
bash2-2.05$ awk -F : ' /* початкове значення максимального номера -0 */ BEGIN { nn=0 } /* наприкінці друкується знайдені ім'я й адреса */ END { printf("%s : %s\n",cc,aa) } /* обробка рядків; шаблон задає обробку тільки тих рядків, */ /* у яких після 2-го символу : коштує одна або більш цифр, */ /* а за ними - пробіл */ /.*:.*:[0-9]* / { \ /* виділення номера будинку */ split($3,a," "); \ /* виявлення й запам'ятовування максимуму */ if (a[1]>nn) { cc=$2; aa=$3; nn=a[1] } \ }' ../metod/query2 VOLLYRITE : 9722 HAMILTON bash2-2.05$ |
|
Приклад 2-3.4
У файлі query3 визначити суму продажів для кожного року.
Розв'язок знов-таки вимагає деякого нагромадження даних. Ми заздалегідь не знаємо навіть, у які роки здійснювалися продажі. Тому нам доведеться ввести два масиви із синхронною індексацією: в одному ми будемо фіксувати рік, а в іншому - число продажів цього року. При переборі рядків файлу випливає в кожному рядку виділяти рік продажу й перевіряти, чи є такий рік у нашому масиві років. Якщо такого року ні, ми додаємо новий елемент у масив років і встановлюємо відповідний йому новий елемент у масиві лічильників продажів в 1. Якщо такий рік уже є, ми збільшуємо відповідний йому новий елемент у масиві лічильників продажів на 1.
Повний текст програми awk і протокол її виконання виглядає так:
bash2-2.05$ awk -F ! ' /* количестов років -0 */ BEGIN { nn=0 } /* по завершенню - роздруківка років і їх лічильників */ END { for (i=0; i<nn; i++) printf("%s - %s\n",year[i],cnt[i]) } /* обробка кожного рядка */ { \ /* виділення року */ y=substr($5,8,2); \ /* перебір уже наявних років; якщо рік у поточному рядку */ /* збігається з одним із уже наявних - збільшення лічильника */ for (i=0; i<nn; i++) \ if (year[i]==y) { cnt[i]++; break } \ /* якщо рік не збіглися з жодним з наявних, додається */ /* новий рік з лічильником 1 */ if (i==nn) { year[i]=y; cnt[i]=1; nn++ } \ }' ../metod/query3 89 - 10 90 - 21 bash2-2.05$ |
|