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

Приклад 1-3

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

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

У заключній обробці ( по шаблонові END) ми перебираємо рядка, збережені в буфері. Якщо номер чергового рядка не збігається з номером передостаннього рядка із крапкою, друкуємо цей рядок без змін. Якщо ж це той самий рядок, то при печатці вона модифікується. Ми використовуємо функцію awk split(), яка розбиває рядок на поля, розділені заданим символом. Частини рядка містяться в заданий масив, а функція повертає число полів, яке вона виявила в рядку. У нашому випадку роздільником є пробіл, а полями - слова. На печатку виводиться спочатку останній елемент масиву - результату функції split(), потім усі елементи із другого по передостанній, і нарешті - перший елемент. Таким чином, у рядку, що друкується, перше й останнє слова міняються місцями.

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

bash2-2.05$ awk '

/* nlines - лічильник рядків у файлі, */

/* point1 і point2 - номера рядків, що закінчуються крапкою, - */

/* останньої й передостанньої відповідно */

BEGIN { nlines=0; point1=0; point2=0; }

/* основна обробка - після закінчення читання файлу */

END { \

/* перебираються всі рядки, збережені в буфері */

for (i=1; i<=nlines; i++) { \

/* перевірка - чи збігається номер рядка з виявленим номером */ 

if (i==point2) { \

/* якщо збігається - рядок розбивається на слова, слова */

/* містяться в масив bb; nw - число виділених слів */

nw= split(buf[i],bb," "); \

/* друкується останнє слово */

printf("%s ",bb[nw]); \

/* друкуються слова від другого до передостаннього */

for (j=2; j<=nw; j++) printf("%s ",bb[j]); \

/* друкується перше слово */

printf("%s\n",bb[1]); \

} \

else \

/* якщо номер не збігається, рядок друкується як є */

print buf[i]; \

} \

} \

/* обробка кожного прочитаного рядка */

{ \

/* прочитані рядки накопичуються в буфері */

buf[++nlines]=$0; \

/* виділяється останній символ рядка */

k=substr($0,length($0),1); \

/* якщо це крапка, модифікуються номери останньої й */

/* передостанньої рядків із крапкою */

if (k==".") { point2=point1; point1=NR; } \

}' Hum-Dum.txt

Humpty-Dumpty

Set on the wall.

Humpty-Dumpty

Had a greate fall.

And all the king's horses,

man. all the king's man. And

And all the king's man.

Can not Humpty,

Can not Dumpty,

Humpty-Dumpty,

Dumpty-Humpty,

Set on this wall

Again.

bash2-2.05$

Script done on Thu Sep 5 08:44:36 2002