Метасимволы, використовувані в регулярних вираженнях 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Метасимволы, використовувані в регулярних вираженнях



Лабораторна робота 3

Тема роботи: Регулярні вираження й команда grep

Ціль роботи: ознайомлення з мовою базових регулярних виражень і командою grep. Хід роботи

Регулярні вираження являють собою одне з найцікавіших і корисних властивостей операційної системи Unix. Регулярні вираження є мовою опису текстових шаблонів, який використовується в багатьох системних утилітах для виконання операцій пошуку й відбору при різноманітних обробках текстових рядків. Ми починаємо вивчати регулярні вираження із застосування їх в утиліті пошуку grep.

У каталозі /home/metod є п'ять текстових файлів з іменами query1, query2, query3, query4 і query5. Файли містять структурований текст. Структура й склад файлів представлений у наступних довідках:

  • структура файлу query1; склад файлу query1
  • структура файлу query2; склад файлу query2
  • структура файлу query3; склад файлу query3
  • структура файлу query4; склад файлу query4
  • структура файлу query5; склад файлу query5

Використовуючи команду grep, виконаєте пошук у файлах рядків, відповідних до певних критеріїв. Імена вихідних файлів і критерії пошуку приводяться у Вашому варіанті індивідуального завдання.

Довідка Структура та склад файлу query1 7369 JOHN Q SMITH CLERK  RESEARCH DALLAS 800 7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600 7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850 7506 LYNN S DENNIS MANAGER SALES DALLAS 2750 7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200 7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250 7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250 7557 KAREN P SHAW SALESPERSON SALES NEW-YORK 1250 7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250 7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250 7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975 7569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 3000 7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250 7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800 7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250 7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850 7698 MARION S BLAKE MANAGER SALES CHICAGO 2850 7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450 7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000 7789 LIVIA N WEST SALESPERSON SALES DALLAS 1500 7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000 7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300 7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000 7876 DIANE G ADAMS CLERK  RESEARCH DALLAS 1100 7900 FRED S JAMES CLERK  SALES CHICAGO 950 7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000 7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875 7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800 7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300 7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750 7954 JAMES T MURRAY CLERK  SALES DALLAS 750 Структура та склад файлу query2 7369 JOHN Q SMITH CLERK  RESEARCH DALLAS 800 7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600 7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850 7506 LYNN S DENNIS MANAGER SALES DALLAS 2750 7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200 7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250 7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250 7557 KAREN P SHAW SALESPERSON SALES NEW-YORK 1250 7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250 7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250 7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975 7569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 3000 7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250 7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800 7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250 7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850 7698 MARION S BLAKE MANAGER SALES CHICAGO 2850 7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450 7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000 7789 LIVIA N WEST SALESPERSON SALES DALLAS 1500 7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000 7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300 7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000 7876 DIANE G ADAMS CLERK  RESEARCH DALLAS 1100 7900 FRED S JAMES CLERK  SALES CHICAGO 950 7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000 7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875 7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800 7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300 7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750 7954 JAMES T MURRAY CLERK  SALES DALLAS 750 Структура та склад файлу query3 7369 JOHN Q SMITH CLERK  RESEARCH DALLAS 800 7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600 7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850 7506 LYNN S DENNIS MANAGER SALES  DALLAS 2750 7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200 7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250 7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250 7557 KAREN P SHAW SALESPERSON SALES  NEW-YORK 1250 7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250 7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250 7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975 7569 CHRIS L ALBERTS MANAGER RESEARCH  NEW-YORK 3000 7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250 7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800 7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250 7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850 7698 MARION S BLAKE MANAGER SALES CHICAGO 2850 7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450 7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000 7789 LIVIA N WEST SALESPERSON SALES  DALLAS 1500 7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000 7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300 7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000 7876 DIANE G ADAMS CLERK  RESEARCH  DALLAS 1100 7900 FRED S JAMES CLERK  SALES CHICAGO 950 7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000 7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875 7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800 7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300 7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750 7954 JAMES T MURRAY CLERK  SALES DALLAS 750 Структура та склад файлу query4 7369 JOHN Q SMITH CLERK  RESEARCH DALLAS 800 7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600 7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850 7506 LYNN S DENNIS MANAGER SALES DALLAS 2750 7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200 7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250 7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250 7557 KAREN P SHAW SALESPERSON SALES NEW-YORK 1250 7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250 7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250 7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975 7569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 3000 7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250 7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800 7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250 7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850 7698 MARION S BLAKE MANAGER SALES CHICAGO 2850 7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450 7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000 7789 LIVIA N WEST SALESPERSON SALES DALLAS 1500 7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000 7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300 7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000 7876 DIANE G ADAMS CLERK  RESEARCH DALLAS 1100 7900 FRED S JAMES CLERK  SALES CHICAGO 950 7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000 7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875 7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800 7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300 7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750 7954 JAMES T MURRAY CLERK  SALES DALLAS 750 Структура та склад файлу query5 7369 JOHN Q SMITH CLERK  RESEARCH  DALLAS 800 7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600 7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850 7506 LYNN S DENNIS MANAGER SALES DALLAS 2750 7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200 7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250 7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250 7557 KAREN P SHAW SALESPERSON SALES NEW-YORK 1250 7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250 7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250 7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975 7569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 3000 7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250 7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800 7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250 7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850 7698 MARION S BLAKE MANAGER SALES CHICAGO 2850 7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450 7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000 7789 LIVIA N WEST SALESPERSON SALES DALLAS 1500 7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000 7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300 7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000 7876 DIANE G ADAMS CLERK  RESEARCH DALLAS 1100 7900 FRED S JAMES CLERK  SALES CHICAGO 950 7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000 7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875 7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800 7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300 7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750 7954 JAMES T MURRAY CLERK  SALES DALLAS 750 Команда grep
Синтаксис: grep [опції] [шаблон] [файл...]

Опис:

  Команда grep виконує пошук рядків, відповідних до шаблону, заданого регулярным_выражением, у файлах або у вхідному потоці. Якщо команда задана без опцій, виводяться всі знайдені рядки. Якщо ім'я файлу не задане, команда виконує пошук у вхідному потоці. Якщо задано кілька імен файлів або в складі імені файлу використаний символ '*', grep перед рядком виводить ім'я файлу, якому цей рядок належить.

Опції:

 
-c виводиться тільки число рядків файлу, відповідних до шаблону
-f файл читання шаблону з файлу
-h не виводяться імена файлів, у яких знайдені рядки, відповідні до шаблону
-i ігнорування верхнього/нижнього регістрів
-l виводяться тільки імена файлів, у яких знайдені рядки, відповідні до шаблону
-n перед кожним виведеним рядком виводиться її номер у файлі
-v шукаються рядки, не відповідні до заданого шаблону
-w шукаються слова, повністю відповідні до шаблону
-x шукаються рядки, повністю відповідні до шаблону

Базові регулярні вираження

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

Завдання 1

У файлі query2 вибрати всі рядки, у яких в адресі є вулиця (" ST. ").

Розв'язок:

  1. Адреса у файлі query2 починається з 31-й позиції (див. структуру файлу). Тому потрібно насамперед пропустити 30 позицій від початку файлу, що можна зробити таким підвиразом: ".\{30\}" - 30 будь-яких символів від початку файлу.
  2. Вулиця позначається в адресі скороченням "ST.", і ця підстрока може стояти в адресі на будь-якому місці, тобто перед нею можуть бути й інші символи. Оскільки загальна довжина адреси - не більш 20 символів, перед підстрокой, яку ми шукаємо, може бути не більш 17 будь-яких символів, що визначається підвиразом: ".*\{0,17\}".
  3. Нарешті, слід указати підстрочкуу, яку ми шукаємо: "ST.". Оскільки в підстроку входить метасимвол "." (крапка), підвираз для пошуку входження буде мати вигляд: "ST\.".
  4. Підсумкове регулярне вираження:
5.     ".\{31\}.*\{0,17\}ST\."
  1. Протокол виконання:
Script started on Thu Sep 5 07:42:02 2002bash2-2.05$ grep ".\{31\}.*\{0,17\}ST\."../metod/query2203:REBOUND SPORTS      :2 E. 14TH ST.  :NEW-YORK :NY:10009:5555989:10000205:POINT GUARD         :20 THURSTON ST.:YONKERS  :NY:10956:5554766:3000211:AT BAT              :234 BEACHEM ST.:BROOKLINE:MA:02146:5557385:8000212:ALL SPORT           :1000 38TH ST.  :BROOKLYN :NY:11210:5551739:6000213:GOOD SPORT          :400 46TH ST.   :SUNNYSIDE:NY:11104:5553771:5000214:AL'S PRO SHOP       :45 SPRUCE ST.  :SPRING   :TX:77388:5555172:8000223:VELO SPORTS         :23 WHITE ST.   :MALDEN   :MA:02148:5554983:5000228:FITNESS FIRST       :5000 85TH ST.  :JACKSON-HEIGHTS:NY:11372:5558710:4000bash2-2.05$ Script done on Thu Sep 5 07:42:18 2002

Завдання 2

У файлі query1 вибрати всі рядки, у яких зарплата становить ціле число тисяч.

Розв'язок 1:

  1.  Згідно зі стуктурою файлу, стовпець зарплати починається з позиції 60, тому - підвираз: ".\{59\}".
  2. Якщо зарплата становить ціле число тисяч, то в ній утримується одна або кілька цифр, за якими іде три нулі - підвираз: "[0-9]\{1,\}000".
  3. Однак можлива (теоретично) зарплата, наприклад "10001", тому варто подбати про те, щоб наступні за трьома нулями символи були відмінні від значущих цифр. Таких символів може бути скільки завгодно, і ця умова можна забезпечити підвиразом: "[0-9]*".
  4. Підсумкове регулярне вираження:
5.     ".\{59\}[0-9]\{1,\}000[0-9]*"
  1. Протокол виконання:
Script started on Thu Sep  5 07:44:14 2002bash2-2.05$ grep ".\{59\}[0-9]\{1,\}000[0-9]*"../metod/query17569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 30007788 DONALD T SCOTT ANALYST RESEARCH DALLAS 30007799 MATTHEW G FISHER ANALYST RESEARCH   NEW-YORK 30007839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 50007902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000bash2-2.05$ Script done on Thu Sep 5 07:44:19 2002

Розв'язок 2:

  1. Оскільки зарплата є останнім полем рядка файлу query1, можливо, можна просто зажадати, щоб три нулі були останніми символами рядка й сформулювати регулярне вираження в такий спосіб: "000$". Однак, такий розв'язок може наткнутися на неочевидну перешкоду. Усе залежить від того, якими засобами був підготовлений вихідний файл query1 (особливо, якщо він був перенесений з іншої системи).
    Справа в тому, що різні програми й редактори використовують різні способи перекладу рядка, і наприкінці рядка можуть виявитися деякі додаткові (невидимі "неозброєним оком" символи. Таким чином, останній 0 у зарплаті може ще не бути останнім символом рядка. Як правило, побачити ці додаткові символи можна, виконавши команду cat з опцією -v. У цьому випадку на видачі команди cat можна побачити недрукований символ, показуваний, наприклад, як: "M".
  2. Наступні протокол ілюструє цей випадок:
Script started on Thu Sep 5 07:45:53 2002bash2-2.05$ grep "000$"../metod/query1bash2-2.05$ cat -v../metod/query17369 JOHN Q SMITH CLERK  RESEARCH DALLAS 800M7499 KEVIN J ALLEN SALESPERSON SALES CHICAGO 1600M7505 JEAN K DOYLE MANAGER SALES NEW-YORK 2850M7506 LYNN S DENNIS MANAGER SALES DALLAS 2750M7507 LESLIE D BAKER MANAGER OPERATIONS NEW-YORK 2200M7521 CYNTHIA D WARD SALESPERSON SALES CHICAGO 1250M7555 DANIEL T PETERS SALESPERSON SALES NEW-YORK 1250M7557 KAREN P SHAW SALESPERSON SALES NEW-YORK 1250M7560 SARAH S DUNCAN SALESPERSON SALES DALLAS 1250M7564 GREGORY J LANGE SALESPERSON SALES DALLAS 1250M7566 TERRY M JONES MANAGER RESEARCH DALLAS 2975M7569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 3000M7600 RAYMOND Y PORTER SALESPERSON SALES NEW-YORK 1250M7609 RICHARD M LEWIS STAFF  OPERATIONS DALLAS 1800M7654 KENNETH J MARTIN SALESPERSON SALES CHICAGO 1250M7676 DENISE D SOMMERS STAFF  OPERATIONS CHICAGO 1850M7698 MARION S BLAKE MANAGER SALES CHICAGO 2850M7782 CAROL F CLARK MANAGER ACCOUNTING NEW-YORK 2450M7788 DONALD T SCOTT ANALYST RESEARCH DALLAS 3000M7789 LIVIA N WEST SALESPERSON SALES DALLAS 1500M7799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 3000M7820 PAUL S ROSS SALESPERSON SALES BOSTON 1300M7839 FRANCIS A KING PRESIDENT ACCOUNTING NEW-YORK 5000M7876 DIANE G ADAMS CLERK  RESEARCH DALLAS 1100M7900 FRED S JAMES CLERK  SALES     CHICAGO 950M7902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000M7916 GRACE M ROBERTS ANALYST RESEARCH NEW-YORK 2875M7919 MICHAEL A DOUGLAS CLERK  RESEARCH NEW-YORK 800M7934 BARBARA M MILLER CLERK  ACCOUNTING NEW-YORK 1300M7950 ALICE B JENSEN CLERK  SALES NEW-YORK 750M7954 JAMES T MURRAY CLERK  SALES DALLAS 750Mbash2-2.05$ Script done on Thu Sep 5 07:46:12 2002

Розв'язок 3:

  1. Уточнимо логікові попереднього розв'язку, оказавшегося неправильним. За трьома нулями перед кінцем рядка може випливати (а може й не випливати) ще один символ, відмінний від значущої цифри:
2.     "000[0-9]\{0,1\}"
  1. Протокол виконання:
Script started on Thu Sep 5 07:48:12 2002bash2-2.05$ grep "000[0-9]\{0,1\}"../metod/query17569 CHRIS L ALBERTS MANAGER RESEARCH NEW-YORK 30007788 DONALD T SCOTT ANALYST RESEARCH DALLAS 30007799 MATTHEW G FISHER ANALYST RESEARCH NEW-YORK 30007839 FRANCIS   A KING PRESIDENT ACCOUNTING NEW-YORK 50007902 JENNIFER D FORD ANALYST RESEARCH DALLAS 3000bash2-2.05$ Script done on Thu Sep 5 07:48:15 2002

Завдання 3

У файлі query4 вибрати всі рядки, у яких дата продажу - весна 1990 р.

Розв'язок:

  1.  За структурою файлу query4 видне, що дата представляється досить легко розпізнаваним способом: рік-місяць- число, таким чином, при пошуку дати, що задовольняє нашим вимогам можна не привязываться до певних позицій у рядку, а просто шукати вираження виду: "[0-9]- весняний_місяць -[0-9]".
  2.  Як розпізнати весняний_місяць? Весняні місяці - "MAR", "APR", "MAY". Перша буква весняного місяця повинна бути "M" або "A", друга - "A" або "P", третя - "R" або "Y". Із цих букв можна скласти буквосполучення, що позначають весняні місяці, а всі інші можливі буквосполучення не є позначеннями місяців взагалі. Таким чином, шаблон для розпізнавання весняного місяця буде: "[MA][AP][RY]".
  3. Підсумкове регулярне вираження:
4.     "[0-9]-[MA][AP][RY]-[0-9]"
  1. Протокол виконання:
bash2-2.05$ grep "[0-9]-[MA][AP][RY]-[0-9]"../metod/query4620 TURNER 100 12-MAR-91 4450526 WEST 221 04-MAR-90 7700555 WEST 221 04-MAR-91 8540528 WEST 224 24-MAR-90 3770558 WEST 224 31-MAR-91 1700503 SHAW 201 25-MAR-89 1876562 SHAW 203 04-MAY-91 2044.5536 SHAW 206 21-MAY-90 2135.6561 ROSS 207 20-APR-91 2558.3506 DUNCAN 208 27-APR-89 2600.4530 DUNCAN 208 03-APR-90 3026.5557 DUNCAN 208 08-MAR-91 2461.8bash2-2.05$ Script done on Thu Sep 5 07:51:47 2002

Хід роботи

 У складі операційної системи Unix є велика кількість системних утиліт, призначених для обробки текстів. Утиліти cat і grep, з якими Ви вже повинні були познайомитися, належать до них. Інші утиліти такого роду: cmp - порівняння файлів, cut - "вирізання" полів з тексту й paste - зчеплення рядків файлів, head - роздруківка початку файлу й tail - роздруківка останніх рядків файлу, sort - сортування, join - об'єднання, sed - потоковий текстовий редактор і багато інші.

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

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

 За замовчуванням більшість команд Unix читає вхідні дані з потоку стандартного введення (клавіатура) і направляє вихідні дані в потік стандартного виводу (екран). Як правило, одним з параметрів команди є ім'я (імена) файлу (файлів), який (які) вона обробляє. Якщо таке ім'я не задане, команда читає вхідні дані зі стандартного введення. Якщо в команді може задаватися кілька файлів, то звичайно стандартне введення позначається серед імен файлів символом '-'.

Є, однак, можливість перенаправляти стандартні потоки. Запис виду:

команда [аргументи] < файл

означає перенапрямок стандартного введення, тобто те, що те дані, які команда звичайно читає із клавіатури, при цьому запуску будуть прочитані нею з файлу з іменем 'файл'.

Записи виду:

команда [аргументи] > файл

і

команда [аргументи] >> файл

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

Запис виду:

команда1 [аргументи] | команда2 [аргументи]

визначає конвеєр або програмний канал. У цьому випадку стандартний вивід команди1 буде переспрямований у стандартне введення команди2. Програмний канал є найбільш популярним засобам при побудові ланцюжків фільтрації.

У даній лабораторній роботі Вам пропонується розробити послідовності команд для розв'язку трьох завдань обробки текстових файлів. Основним інструментом для розв'язку цих завдань для Вас будуть, очевидно (але не обов'язково), буде редактор sed і утиліта з'єднання join. Інші засоби Ви виберете самі. Ми, однак, забороняємо використовувати в цій роботі утиліту awk - їй буде присвячена окрема робота.

Завдання 1

Виконати відповідно до Вашого варіанта індивідуального завдання перетворення одного з текстових файлів, створених Вами в роботі N1. Результат зберегти в новому файлі, вихідний файл повинен залишитися без зміни.

Завдання 2

Виконати відповідно до Вашого варіанта індивідуального завдання вибірку даних з файлів../metod/query*:

  • структура файлу query1; склад файлу query1
  • структура файлу query2; склад файлу query2
  • структура файлу query3; склад файлу query3
  • структура файлу query4; склад файлу query4
  • структура файлу query5; склад файлу query5

с якими Ви працювали в роботі N3. Результат зберегти в новому файлі.
Таблиці, що втримуються в цих файлах, утворюють " базу даних", концептуальна схема якої показана здесь.

Завдання 3

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

Довідка

 

Вибрані команди Unix. Короткий опис:

Інформаційні команди: info, man.

Введення й редагування текстів: tee, ed, sed, vi

 

Вивід текстів: cat, more, pr, pg

Команди файлової системи: cd, chgrp, chmod, chown, cp, file, find, ln, ls, mkdir, mv, pwd, rm, rmdir

 

Обробка [текстових] файлів: awk, cmp, comm, cut, diff, diff3, grep, head, join, paste, sort, split, tali, uniq, wc

Пошта, процеси, час, etc.: cal, date, echo, env, export, kill, mail, mesg, nice, ps, script, sh, who, write

Команди інтерпретатора shell: basename, expr, read, shift, test

 

Завдання 1

Робота всіх варіантів демонструється на обробці файлу з іменем Hum-Dum.txt, вихідний уміст якого показано в наступному протоколі:

Script started on Thu Sep 5 07:56:10 2002bash2-2.05$ cat Hum-DumHumpty-DumptySet on the wall.Humpty-DumptyHad a greate fall.And all the king's horses,And all the king's man.Can not Humpty,Can not Dumpty,Humpty-Dumpty,Dumpty-Humpty,Set on this wallAgain.bash2-2.05$Script done on Thu Sep 5 07:56:21 2002

Нижче приводяться деякі загальні міркування за рішенням завдань 1-го завдання.

У більшості випадків ми можемо легко сформулювати оператори потокового редактора, необхідні для виконання заданого перетворення, за винятком одного компонента - адреси рядка, до якого це перетворення повинне бути застосоване. У деяких випадках нам також заздалегідь невідомий і текст, який необхідно вставити в цільовий рядок. Тому типова схема розв'язку наступна:

  1. Визначаються номери рядків, до яких повинні бути застосовані перетворення, а при необхідності - також і текст, який повинен вставлятися в цільовий файл. Для визначення застосовуються статичні (заздалегідь відомі й закладені в текст команд) команди потокового редактора. Результати цього кроку зберігаються у файлі.
  2.  Шляхом редагування результатів 1-го кроку динамічно формуються команди sed для виконання перетворення тексти, що містять адреси й, певні на 1-м кроці. Ці команди зберігаються у файлі.
  3. Виконується редагування вихідного тексту командами, збереженими на 2-м кроці.

Можливі два підходи до одержання номерів рядків, що підлягають перетворенню:

  • виконати нумерування всіх рядків вихідного файлу (це можна зробити командою pr або командою cat з опцією -n), а потім із пронумерованої послідовності рядків вибрати рядок, призначену для обробки з її номером; таке приймання застосоване в розв'язках для варіантів 1 і 2;
  • вибрати номер рядка, призначеної для обробки, за допомогою команди sed "="; таке приймання застосовано для варіанта 3.

Оскільки Unix має велика кількість утиліт для обробки текстів, причому функції багатьох утиліт перекриваються, кожна із запропонованих завдань може бути вирішена безліччю різних способів.

Завдання 1, варіант 1

Кожне друге слово кожного рядка вивести в окремий наступний рядок. Якщо в рядку тільки одне слово, нічого не робити.

Розв'язок:

pr -n' ' -T Hum-Dum.txt | Вивести файл без заголовка й зайвих рядків, але з номерами рядків.
sed -n 's/ *//p' | Вилучити головні пробіли.
cut -f1,3 -d' ' | Вирізати номер і 2-е слово.
sed -n '/[0-9]/p' >temp01 Вилучити рядка, що містять тільки номер, результат зберегти в 1-м тимчасовому файлі.
cut -f1 -d' ' temp01 | Вибрати з 1-го тимчасового файлу номера рядків.
sed -n 's/$/a\\/p' >temp02 Додати до них 'a\' і зберегти в 2-м тимчасовому файлі.
cut -f2 -d' ' temp01 >temp03 Вибрати з 1-го тимчасового файлу слова й зберегти в 3-м тимчасовому файлі.
paste -d'\n' temp02 temp03 >temp01 Зкріпити построково 2-й і 3-й тимчасові файли, вставивши між рядками, що зчіплюються, переклад рядка. Результат зберегти в 1-м тимчасовому файлі. Результат - набір команд sed на вставку.
sed -f temp01 Hum-Dum.txt >result Виконати команди з 1-го тимчасового файлу, зберегти результат.
rm -f temp* Вилучити тимчасові файли.

Протокол виконання:

Script started on Thu Sep 5 08:00:29 2002bash2-2.05$ pr -n' ' -T Hum-Dum.txt |> sed -n 's/ *//p' |> cut -f1,3 -d' ' |> sed -n '/[0-9]/p' >temp01bash2-2.05$ cut -f1 -d' ' temp01 |> sed -n 's/$/a\\/p' >temp02bash2-2.05$ cut -f2 -d' ' temp01 >temp03bash2-2.05$ paste -d'\n' temp02 temp03 >temp01bash2-2.05$ sed -f temp01 Hum-Dum.txt >resultbash2-2.05$ rm -f temp*bash2-2.05$ cat resultHumpty-DumptySet on the wall.onHumpty-DumptyHad a greate fall.aAnd all the king's horses,allAnd all the king's man.allCan not Humpty,notCan not Dumpty,notHumpty-Dumpty,Dumpty-Humpty,Set on this wallonAgain.bash2-2.05$Script done on Thu Sep 5 08:00:47 2002

 Зверніть увагу на те, що у вищенаведеному протоколі деякі запрошення системи виглядають як "$", а деякі - як ">". Система друкує запрошення ">" (вторинне запрошення), якщо попередня команда закінчується ознакою конвеєра "|" і, отже, обов'язково очікується введення наступної команди. А якщо ні, то друкується первинне запрошення - "$". Символи первинного й вторинного запрошення визначаються змінними оточення PS1 і PS2 відповідно.

Завдання 1, варіант 2

Перший символ кожного рядка замінити на перший символ наступного рядка. Останній рядок залишається без змін.

Розв'язок:

pr -n' ' -T Hum-Dum.txt | Вивід з нумерацією рядків.
cut -c7 | Виділення 1-го символу.
sed -n '2,$p' >temp01 Видалення 1-й рядка, символ з неї нікуди не підставляється.1-е символи рядків зберігаються в тимчасовому файлі.
pr -n' ' -T Hum-Dum.txt | Вивід з нумерацією рядків.
sed -n 's/[ ]*//p' | Видалення головних пробілів.
cut -f1 -d' ' | Вивід тільки стовпця номерів.
paste -d' ' - temp01 | Зчеплення номера рядка (вхідний потік) з 1-м символом наступного рядка (тимчасовий файл). Виходить, наприклад: '3 H'.
sed '$d' | Видалення останнього рядка - у неї нічого не підставляється.
sed -n 's/ /s\/\\.\//p' | Заміна пробілу між номером і символом на службові символи. Виходить: '3s/./H'.
sed -n 's/$/\//p' >temp01 Додавання службових символів у кінець рядка. Виходить: '3s/./H/' - команда sed на зміну 1-го символу рядка. (Зверніть увагу: ця команда не закінчується прапором 'p'.) Команди зберігаються в тимчасовому файлі.
sed -f temp01 Hum-Dum.txt >result Тимчасовий файл використовується як командний скрипт sed. (Зверніть увагу: якби в командах скрипта не було б прапора 'p', а в даній команді не було б опції -n, не вивівся б останній рядок, для якого немає підстановки в скрипті). Результат зберігається.
rm -f temp* Видалення тимчасового файлу.

Протокол виконання:

Script started on Thu Sep 5 08:05:45 2002bash2-2.05$ pr -n' ' -T Hum-Dum.txt |> cut -c7 |> sed -n '2,$p' >temp01bash2-2.05$ pr -n' ' -T Hum-Dum.txt |> sed -n 's/[ ]*//p' |> cut -f1 -d' ' |> paste -d' ' - temp01 |> sed '$d' |> sed -n 's/ /s\/\\.\//p' |> sed -n 's/$/\//p' >temp01bash2-2.05$ sed -f temp01 Hum-Dum.txt >resultbash2-2.05$ rm -f temp*bash2-2.05$ cat resultSumpty-DumptyHet on the wall.Humpty-DumptyAad a greate fall.And all the king's horses,Cnd all the king's man.Can not Humpty,Han not Dumpty,Dumpty-Dumpty,Sumpty-Humpty,Aet on this wallAgain.bash2-2.05$Script done on Thu Sep 5 08:06:12 2002

Завдання 1, варіант 3

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

Розв'язок:

sed -n '/\.$/=' Hum-Dum.txt | Вивід номерів усіх рядків, які закінчуються крапкою.
tail -2 | Вивід двох останні із цих номерів.
head -n1 > temp01 Вивід першого із двох останніх номерів. Збереження в temp01.
sed -n 's/$/s\/ \.\*\/\/p/p' temp01 >temp02 Формування команди sed на вивід 1-го слова рядка з номером, збереженим в temp01. Команда зберігається в temp02.
sed -n -f temp02 Hum-Dum.txt >temp03 Виконання команди з temp02, запис 1-го слова в temp03.
sed -n 's/$/s\/\[\ \]\* \/\/gp/p' temp01 >temp02 Формування команди sed на вивід останнього слова рядка з номером, збереженим в temp01. Команда зберігається в temp02.
sed -n -f temp02 Hum-Dum.txt >temp04 Виконання команди з temp02, запис останнього слова в temp04.
paste -d' ' temp01 temp03 | Зчеплення через пробіл номера рядка й останнього слова рядка.
sed -n 's/ /s\/\ [\ \]\*$\/ /p' | Формування команди sed на заміну в рядку з номером, обраним з temp01, 1-го слова на текст, обраний з temp03.
sed -n 's/$/\//p' >temp03 Завершення формування команди й збереження її в temp03.
paste -d' ' temp01 temp04 | Зчеплення через пробіл номера рядка й 1-го слова рядка.
sed -n 's/ /s\/\\[\ \]\* \//p' | Формування команди sed на заміну в рядку з номером, обраним з temp01, останнього слова на текст, обраний з temp04.
sed -n 's/$/ \//p' >temp04 Завершення формування команди й збереження її в temp04.
sed -f temp03 Hum-Dum.txt | Виконання для вихідного файлу команди з temp03.
sed -f temp04 >result Виконання для того, що вийшло, команди з temp04.
rm -f temp* Видалення тимчасових файлів.

Протокол виконання:

Script started on Thu Sep 5 08:10:13 2002bash2-2.05$ sed -n '/\.$/=' Hum-Dum.txt |> tail -2 |> head -n1 > temp01bash2-2.05$ sed -n 's/$/s\/ \.\*\/\/p/p' temp01 >temp02bash2-2.05$ sed -n -f temp02 Hum-Dum.txt >temp03bash2-2.05$ sed -n 's/$/s\/\[\ \]\* \/\/gp/p' temp01 >temp02bash2-2.05$ sed -n -f temp02 Hum-Dum.txt >temp04bash2-2.05$ paste -d' ' temp01 temp03 |> sed -n 's/ /s\/\ [\ \]\*$\/ /p' |> sed -n 's/$/\//p' >temp03bash2-2.05$ paste -d' ' temp01 temp04 |> sed -n 's/ /s\/\\[\ \]\* \//p' |> sed -n 's/$/ \//p' >temp04bash2-2.05$ sed -f temp03 Hum-Dum.txt |> sed -f temp04 >result> bash2-2.05$ rm -f temp*bash2-2.05$ cat resultHumpty-DumptySet on the wall.Humpty-DumptyHad a greate fall.And all the king's horses,man. all the king's AndCan not Humpty,Can not Dumpty,Humpty-Dumpty,Dumpty-Humpty,Set on this wallAgain.bash2-2.05$Script done on Thu Sep 5 08:10:46 2002

Завдання 2

Робота всіх варіантів цього завдання відбувається на наборі файлів:../metod/query*., query1, query2, query3, query4, query5. Ті, хто не приклав ще досить зусиль для того, щоб забути наш курс "Організація баз даних", без праці довідаються в цих файлах результати виконання запитів до бази даних "Корпорація Кинга". Ці результати являють собою таблиці (реляційні таблиці) і становлять як би базу даних, схема якої показана нижче:

Варіанти завдання 2 являють собою завдання на вибірку даних з "таблиць" цієї " бази даних". Утиліти Unix надають у наше розпорядження наступні засоби, які тією чи іншою мірою можуть служити аналогом реляційних операцій:

  • Операція проекції може бути здійснена вирізанням певних полів рядка - командою cut.
  • Операція обмеження може бути здійснена який-небудь із утиліт, що здійснюють пошук рядка по шаблонові - grep або sed.
  • Операція природнього з'єднання може бути здійснена утилітою join. Випливає однак пам'ятати, що для застосування утиліти join таблиці повинні бути відсортовані по тому стовпцю, по якому відбувається з'єднання, це можна зробити за допомогою утиліти sort.
  • Дублікати у файлах-таблицях можуть бути усунуті за допомогою утиліти uniq або утиліти sort з опцією -u. Слід мати у виді, що в першому випадку дублікатами вважаються збіги повних рядків, а в другому - тільки тих полів, по яких виконується сортування.
  • Розглянуті нами утиліти не надають тих можливостей, які надають агрегатні функції SQL, однак функції MAX() і MIN() можна промоделювати, виконавши сортування таблиці й вибравши потім першу (утиліта head) або останню (утиліта tail) рядок.

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

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

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

Завдання 2 варіант 1

Визначити прізвища продавців, які виконували замовлення, що полягають із більш ніж 5 пунктів.

Розв'язок:

sed 's/ \{1,\}/\:/g'../metod/query5 | Установка у файлі query5 роздільника ":".
cut -f1,2 -d':' | Проекція по номеру пункту й номеру замовлення.
sort +0 -1 -t':' -n | Числова (опція -n) - сортування по номеру пункту.
sed '/[1-4]:/d' >temp01 Видалення тих рядків, у яких номер пункту 1-4.
sort +1 -2 -t':' >temp01 Сортування по номеру замовлення. Результат зберігається в temp01.
sed 's/ \{1,\}/\:/g'../metod/query4 | Установка у файлі query4 роздільника ":".
cut -f1,2 -d':' | Проекція по номеру замовлення й прізвища продавця.
sort +0 -1 -t':' | Сортування по номеру замовлення.
join -j1 1 -j2 2 -t':' - temp01 | З'єднання зі збереженим в temp01.
cut -f2 -d':' | Проекція на прізвище продавця.
sort +0 -1 -t':' -u >result Сортування на прізвище продавця з усуненням дублікатів.
rm -f temp* Видалення тимчасового файлу.

Протокол виконання:

Script started on Thu Sep 5 08:13:56 2002bash2-2.05$ sed 's/ \{1,\}/\:/g'../metod/query5 |> cut -f1,2 -d':' |> sort +0 -1 -t':' -n |> sed '/[1-4]:/d' |> sort +1 -2 -t':' >temp01bash2-2.05$ sed 's/ \{1,\}/\:/g'../metod/query4 |> cut -f1,2 -d':' |> sort +0 -1 -t':' |> join -j1 1 -j2 2 -t':' - temp01 |> cut -f2 -d':' |> sort +0 -1 -t':' -u >resultbash2-2.05$ rm -f temp*bash2-2.05$ cat resultDUNCANROSSSHAWTURNERWARDbash2-2.05$Script done on Thu Sep 5 08:14:14 2002

Завдання 2, варіант 2

Визначити покупців, які нічого не купували в лютому 1990 р.

Розв'язок:

cut -f1,2 -d':'../metod/query2 | Проекція по коду й імені покупця.
sort +0 -1 -t':' >temp01 Сортування по коду, збереження.
sed 's/ \{1,\}/\:/g'../metod/query4 | Установка роздільника ':'.
cut -f3,4 -d':' | Виділення коду покупця й дати.
sed -n '/-FEB-91/p' | Обмеження по даті.
sort +0 -1 -t':' -u | Сортування по коду покупця, ліквідація дублікатів кодів.
join -j1 1 -j2 1 -t':' -a2 - temp01 | З'єднання по коду покупця (праве зовнішнє).
sed -n '/[:]*:[:]*$/'p | Вибірка тих рядків, у яких тільки один раз зустрічається роздільник полів, тобто, немає дати.
cut -f2 -d':' | Проекція по імені покупця.
sort +0 -1 >result Сортування по імені.
rm -f temp* Видалення тимчасових файлів.

Протокол виконання:

Script started on Thu Sep 5 08:16:50 2002bash2-2.05$ cut -f1,2 -d':'../metod/query2 |> sort +0 -1 -t':' >temp01bash2-2.05$ sed 's/ \{1,\}/\:/g'../metod/query4 |> cut -f3,4 -d':' |> sed -n '/-FEB-91/p' |> sort +0 -1 -t':' -u |> join -j1 1 -j2 1 -t':' -a2 - temp01 |> sed -n '/[:]*:[:]*$/'p |> cut -f2 -d':' |> sort +0 -1 >resultbash2-2.05$ rm -f temp*bash2-2.05$ cat resultAL AND BOB'S SPORTSAL'S PRO SHOPALL SPORTAT BATBOB'S FAMILY SPORTSBOB'S SWIM, CYCLE, AND RUNCENTURY SHOPEVERY MOUNTAINFAST BREAKGOOD SPORTHIT, THROW, AND RUNHOOPSJOCKSPORTSJOE'S BIKE SHOPJUST BIKESJUST TENNISPOINT GUARDREBOUND SPORTSSHAPE UPSTADIUM SPORTSTHE ALL AMERICANTHE COLISEUMTHE OUTFIELDTHE POWER FORWARDTHE TOURTKB SPORT SHOPVELO SPORTSWHEELS AND DEALSWOMENS SPORTSbash2-2.05$Script done on Thu Sep 5 08:17:08 2002

Завдання 2, варіант 3

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

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

Хоча всі обирані дані перебувають в одній таблиці, нам необхідно буде застосувати тут автосоединение - з'єднання таблиці із самої собою.

Розв'язок:

sed 's/ \{1,\}/\:/g'../metod/query1 >temp01 Установка роздільника ':' у файлі query1 (просто для зручності). Збереження в temp01.
sed -n '/:PRESIDENT:/p' temp01 >temp02 Виділення рядка президента. Збереження в temp02.
sed '/:PRESIDENT:/d' temp01 | Видалення рядка президента.
cut -f4,6,7 -d':' temp01 >temp03 Виділення полів прізвища, назви відділу, міста. Збереження в temp03.
cut -f6 -d':' temp02 >temp01 Виділення назви відділу в рядку президента. Збереження в temp01.
sort +1 -2 -t':' temp03 | Сортування інших службовців по полю назви відділу.
join -j1 2 -j2 1 -t':' - temp01 | З'єднання з назвою відділу президента, збереженим в temp01.
cut -f2 -d':' | Виділення з результату прізвищ службовців.
sort +0 -1 -t':' >temp04 Сортування прізвищ і збереження їх в temp04.
cut -f7 -d':' temp02 >temp01 Виділення міста в рядку президента. Збереження в temp01.
sort +2 -3 -t':' temp03 | Сортування інших службовців по полю міста.
join -j1 3 -j2 1 -t':' - temp01 | З'єднання з містом президента, збереженим в temp01.
cut -f2 -d':' | Виділення з результату прізвищ службовців.
sort +0 -1 -t':' | Сортування прізвищ.
join -j1 1 -j2 1 - temp04 >result З'єднання тих, у кого збігається відділ, з тими, у кого збігається місто. Результат зберігається.
rm -f temp* Видалення тимчасових файлів.

Протокол виконання:

Script started on Thu Sep 5 08:20:36 2002bash2-2.05$ sed 's/ \{1,\}/\:/g'../metod/query1 >temp01bash2-2.05$ sed -n '/:PRESIDENT:/p' temp01 >temp02bash2-2.05$ sed '/:PRESIDENT:/d' temp01 |> cut -f4,6,7 -d':' temp01 >temp03bash2-2.05$ cut -f6 -d':' temp02 >temp01bash2-2.05$ sort +1 -2 -t':' temp03 |> join -j1 2 -j2 1 -t':' - temp01 |> cut -f2 -d':' |> sort +0 -1 -t':' >temp04bash2-2.05$ cut -f7 -d':' temp02 >temp01bash2-2.05$ sort +2 -3 -t':' temp03 |> join -j1 3 -j2 1 -t':' - temp01 |> cut -f2 -d':' |> sort +0 -1 -t':' |> join -j1 1 -j2 1 - temp04 >resultbash2-2.05$ rm -f temp*bash2-2.05$ cat resultCLARKKINGMILLERbash2-2.05$Script done on Thu Sep 5 08:20:56 2002

Завдання 3

Джерелом вхідних даних для всіх варіантів цього завдання може бути команда печатки вмісту каталогів ls або команда пошуку файлів find. Вихідний потік першої команди направляється в конвеєр, де він може послідовно оброблятися командами обробки текстів: grep, sed, cut, sort і т.п. Якщо в завданні потрібно підрахувати число елементів, в останній ланці конвеєра може бути застосована команда wc.

 При виконанні завдання слід мати у виді, що користувацькі групи в системі збігаються з кодами студентських груп (наприклад: "ap109", "ap070b" і т.д.), усе коди починаються з букв "ap"; а імена користувачів формуються як: ім'я_группы nn, де nn - порядковий номер у групі.

Завдання 3 варіант 1

Визначити загальна кількість студентських груп.

Розв'язок:



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 79; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.153.38 (0.115 с.)