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

Приклад 2-3.1

У файлі query3 визначити товар з найбільшою різницею мінімальної й максимальної ціни

Розв'язок надзвичайний простої. Це тривіальний алгоритм пошуку максимуму, цикл перебору рядків організує для нас awk. Максимальна й мінімальна ціни становлять 3-е й 4-е поля рядка відповідно. Для ідентифікації товару слід запам'ятати також і його назва - поле 2. Роздільником полів у файлі query3 є символ "!", так що awk повинна викликатися з опцією -F, що визначає роздільник.

Повний текст програми awk і протокол її виконання виглядає так:

bash2-2.05$ awk -F ! '

/* після закінчення обробки друкуються запомненные дані */

END { printf("%s: %f-%f=%f\n",pp,pmax,pmin,pmax-pmin) }

/* при обробці кожного рядка */

{ \

/* якщо це перший рядок, запам'ятовується мінімальна й */

/* максимальна ціна й різниця між ними, а також ім'я */

/* якщо рядок не перша, але різниця цін у ній перевищує */

/* запомненную раніше, ціни, різниця, і ім'я теж запам'ятовуються */ 

if ((NR==1)||($3-$4>pmax-pmin)) \

{ pp=$2; pmin=$4; pmax=$3 } \

}' ../metod/query3

DUNK BASKETBALL PROFESSIONAL: 58.300000-40.800000=17.500000

bash2-2.05$

Приклад 2-3.2

У файлі query2 визначити всіх покупців, у яких кредит вище за середнє

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

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

Повний текст програми awk і протокол її виконання виглядає так:

bash2-2.05$ awk -F : '

/* початкові установки: число рядків -0, сума кредиту - 0 */

BEGIN { nn=0; cc=0 }

/* заключні дії */

END {

/* усереднення */

cc/=nn; \

/* перебір збережених даних */

/* якщо кредит перевищує середній - печатка */

for (i=0; i<nn; i++) \

if (crd[i]>cc) printf("%s - %d\n",cust[i], crd[i]) \

} \

/* обробка кожного рядка: запам'ятовування імені й кредиту, */

/* нагромадження суми кредиту, підрахунок загального числа рядків */

{ cust[nn]=$2; crd[nn]=$8; cc+=$8; nn++ }

' ../metod/query2

TKB SPORT SHOP - 10000

VOLLYRITE - 7000

EVERY MOUNTAIN - 10000

WOMENS SPORTS - 10000

NORTH WOODS HEALTH CENTER - 8000

STADIUM SPORTS - 10000

REBOUND SPORTS - 10000

THE POWER FORWARD - 12000

FAST BREAK - 7000

AT BAT - 8000

AL'S PRO SHOP - 8000

BOB'S FAMILY SPORTS - 8000

WHEELS AND DEALS - 10000

BOB'S SWIM, CYCLE, AND RUN - 7000

bash2-2.05$