Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы (2 семестр).docx
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
193.38 Кб
Скачать

Приклад 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$