Виділення рядків за значенням у стовпці 


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



ЗНАЕТЕ ЛИ ВЫ?

Виділення рядків за значенням у стовпці




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

var= шукане_значення sed -n '/ специфікації_визначальні_позицію '$var'p' файл

але в деяких випадках (якщо важко сформулювати специфікації_визначальні_позицію) може виявитися зручніше застосувати штучне приймання: записати шукане_значення в окремий файл і виконати його з'єднання з вихідним файлом:

# запис шуканого_значення в тимчасовий файл echo " шукане_значення " >$HOME/tempfile # сортування вихідного файлу по необхідному стовпцю sort + позиція-1 - позиція -t' разделитель ' файл | # з'єднання: 1-й файл - результат попередньої команди, у ньому # для з'єднання береться необхідний стовпець, 2-й файл - тимчасовий # файл, у ньому - стовпець перший і єдиний join -j1 позиція -j2 1 -t' разделитель ' - $HOME/tempfile

Приклад 1

Завдання
 Перевірити, працює чи в мережі заданий користувач. Якщо так - відправити йому повідомлення по write. Якщо користувача немає в мережі або він заблокував термінал, - відправити повідомлення по mail.

Формат застосування цієї команди повинен бути:

команда користувач...

Нижче ми приводимо текст скрипта (ми назвали його ex7_1) з докладними коментарями.

#!/bin/bash2 # ============================================================== # # Скрипт ex7_1: відправлення повідомлення/листа заданим користувачам # # ============================================================== # # Коментар!/bin/bash2 описує місцезнаходження командного # інтерпретатора shell. Він допомагає системі знайти інтерпретатор, # а також допомагає команді file визначити тип файла-скрипта. # У більшості випадків він не є обов'язковим, але є       # "правилом гарного тону" у програмуванні. # ======================================================= # # Текст повідомлення/листа заноситься у файл temp01 # Зверніть увагу: тимчасовий файл розміщається в домашньому # каталозі користувача. echo Це тестове повідомлення > $HOME/temp01       echo для перевірки зв'язку зі скрипта. >>$HOME/temp01 echo Бажаю успіху! >>$HOME/temp01 echo ap10999 >>$HOME/temp01 # ======================================================== # Параметри команди являють собою список імен користувачів. # Наступним оператором організує цикл, який виконується до # тих пор, поки залишаються неопрацьовані параметри. while [ $# -ne 0 ]       do   # ======================================================   # Значення 1-го параметра привласнюється змінної us   us=$1   # ======================================================   # Віддаляється файл temp02. Зверніть увагу: діагностика команди   # rm пригнічується (направляється в "системну корину"). Ця діагностика   # може повідомляти про те, що файлу, що віддаляється, не існує -         # вона нам не потрібна.   rm $HOME/temp02 2>/dev/null   # ======================================================   # Спроба видачі повідомлення користувачеві.   # Системне введення команди write направляється на файл temp01.   # Якщо не вдається встановити з'єднання з користувачем (користувача   # немає в системі або він заблокував свій термінал) команда write   # виводить діагностичне повідомлення (ми його пригнічуємо) і   # повертає false.   if write $us <$HOME/temp01 2>/dev/null     then     # ====================================================     # Якщо повідомлення пройшло - OK! виводимо на свій термінал     # повідомлення про цей, і - "обробка користувача" закінчена.     echo "Користувачеві $us відправлене повідомлення"         else           # ====================================================     # Якщо повідомлення не пройшло - спроба відправлення листа     # Системне введення команди mail направляється на файл temp01.     # Команда mail завжди повертає true. Вона тільки запускає     # дочірній процес sendmail, і, якщо відправлення листа не вдалося,     # це буде з'ясовано тільки в дочірньому процесі, яка видасть     # діагностику, цю діагностику перенаправляємо в тимчасовий     # файл temp02.     mail $us <$HOME/temp01 >$HOME/temp02     # ====================================================     # Очікуємо 1 сек, щоб дочірній процес встигнув записати     # у файл temp02 повідомлення про те, що лист не відправлений          sleep 1     # ====================================================     # Перевіряємо, чи їсти що-небудь у файлі temp02     if test -s $HOME/temp02       then       # ==================================================       # Якщо файл temp02 не порожній - користувач не знайдений       echo "Користувач $us не знайдений"             # ==================================================       # у цьому випадку лист попадає у файл dead.letter,       # який нам не потрібний       rm $HOME/dead.letter 2>/dev/null     else             # ==================================================       # Якщо файл temp02 порожній - лист відправлений       echo "Користувачеві $us відправлений лист"           # ====================================================     # Кінець умови if test -s $HOME/temp02     fi   # ======================================================   # Кінець умови if write $us...   fi       # ======================================================   # Зрушення списку параметрів   shift # ======================================================== # Кінець циклу while done # ======================================================== # Після виходу із циклу # Віддаляються тимчасові файли rm $HOME/dead.letter 2>/dev/null rm $HOME/temp01 2>/dev/null rm $HOME/temp02 2>/dev/null # ======== Кінець скрипта ex7_1 ================================= #

Нижче наведений зразок виконання створеної команди:

bash2-2.05$ sh ex1_7 ap10999 ap10998 ap1097Користувачеві ap10999 відправлене повідомленняКористувачеві ap10998 відправлений листКористувач ap1097 не знайденийbash2-2.05$
 

 

Приклад 2

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

Формат застосування цієї команди повинен бути:

команда каталог...

Cкрипт названий ex7_2, його текст із докладними коментарями приводиться нижче.

#!/bin/bash2 # ============================================================== # # Скрипт ex7_2: пошук співпадаючих перших рядків              # # ============================================================== # # ======================================================== # Запам'ятовуємо поточний каталог mydir=`pwd` # ======================================================== # Параметри команди являють собою список каталогів. # Наступним оператором організує цикл, який виконується до # тих пор, поки залишаються неопрацьовані параметри. while [ $# -ne 0 ]   do   # ======================================================   # Перехід у каталог, що задається 1-м параметром;   # діагностика направляється в тимчасовий файл   cd $1 2>$HOME/temp01   # ======================================================   # Перевірка - не чи порожній файл із діагностикою         if test -s $HOME/temp01     then     # ====================================================     # Якщо є діагностика - каталог недоступний     echo "Каталог $1 недоступний/не існує"     # ====================================================     # Перехід до наступного параметра     shift     # ====================================================     # Пропуск залишку тіла циклу     continue     fi   # ======================================================   # Ми ввійшли в заданий каталог   echo "Каталог: $1"   # ======================================================   # Вибираються файли розміром більше 0,   # список файлів направляється в потік   find -size +0c -type f |         # ======================================================   # Файли в списку виведені із вказівкою каталогу./,   # від цих символів потрібно позбутися;   # результат записується в тимчасовий файл   sed 's/.\///' >$HOME/temp01   # ======================================================   # Цикл поки у файлі temp01 щось залишається   while test -s $HOME/temp01     do     # ====================================================     # Вибирається в змінну $f1 перший рядок з     # тимчасового файлу - ім'я чергового файлу     f1=`head -n1 $HOME/temp01`     # ====================================================     # Вибирається в змінну $s1 перший рядок з     # обраного файлу           s1=`head -n1 $f1`     # ====================================================     # $n - ознака того, що збіг рядків не знайдений     # $m - номер другого файлу зі списку     n="no"; m=2;     # ====================================================     # Нескінченний цикл - вихід по break     while [ 1 ]       do       # ==================================================       # Вибирається $ m-я рядок зі списку файлів - ім'я файлу       f2=`sed -n ''$m'p' $HOME/temp01`       # ==================================================       # Якщо обраний порожній рядок - список файлів закінчився       if [ "$f2" = "" ]; then         # ================================================         # у цьому випадку - вихід із циклу         break         # ================================================             # Кінець умови if [ "$f2" = "" ]         fi       # ==================================================       # Вибирається 1-я рядок із цього файлу       s2=`head -n1 $f2`       # ==================================================       # Рядок рівняється із запомненной раніше рядком з 1-го       # файлу в списку       if [ "$s1" = "$s2" ]; then         # ================================================         # Перевірка - чи були вже збігу         if [ "$n" = "no" ]; then           # ==============================================           # Якщо збігів не було - виводиться ім'я 1-го файлу зі списку           echo -n "$f1 "; n="yes"           # ==============================================           # Кінець умови if [ "$n" = "no" ]           fi         # ================================================         # Виводиться ім'я файлу, у якому знайдений збіг         echo -n "$f2 "         # ================================================         # Файлу, у якому знайдений збіг, віддаляється з файлу-списку         sed ''$m'd' $HOME/temp01 > $HOME/temp02         cat $HOME/temp02 >$HOME/temp01         # ================================================         # Кінець дій при збігу             else               # ================================================         # Якщо немає збігу - перехід до наступного файлу зі списку         m=`expr $m + 1`         # ================================================         # Кінець дій при відсутності збігу         fi       # ==================================================       # Кінець циклу перебору інших файлів списку       done     # ====================================================     # Якщо були знайдені збіги - виводиться текст загального рядка     if [ "$n" = "yes" ]; then       echo "- $s1"       fi     # ====================================================     # Видалення 1-й рядка зі списку імен файлів     sed '1d' $HOME/temp01 > $HOME/temp02     cat $HOME/temp02 >$HOME/temp01     # ====================================================     # Кінець циклу перебору імен файлів     done   # ======================================================   # Перехід до наступного параметра   shift   # ======================================================   # Кінець списку перебору параметрів   done # ======================================================== # Видалення тимчасового файлу rm $HOME/temp* # ======================================================== # Повернення у вихідний каталог cd "$mydir" # ======== Кінець скрипта ex7_2 ================================= #

Зразок виконання створеної команди:

bash2-2.05$ ex7_2../ap10999 /home/metodКаталог../ap10999 недоступний/не існуєКаталог: /home/metodHum-Dum.txt H1 - Humpty-Dumptynikol_01 nikol_02 nikol_03 nikol_04 nikol_05 nikol_06 nikol_07 nikol_08 nikol_09 nikol_10 nikol_11 nikol_12 nikol_13 nikol_14 nikol_15 nikol_16 nikol_17 nikol_18 - Микола Олейниковbash2-2.05$
 

 

Приклад 3

Завдання
 За інформацією файлів /home/metod/query* для заданого коду товару визначити, скільки його екземплярів було продано в заданий місяць.

Формат застосування:

команда місяць код_товару...

Місяць задається у форматі: MON-YY, наприклад: JAN-90, JUN-89, NOV-17 і т.п.

Cкрипт названий ex7_3, його текст із докладними коментарями приводиться нижче.

#!/bin/bash2 # ============================================================== # # Скрипт ex7_3: вибірка обсягу продажів заданого товару      # # ============================================================== # # Вибирається 1-й параметр і список параметрів зрушується mon=$1; shift # ======================================================= # Місяць записується у файл echo "$mon" >$HOME/temp01 # ======================================================= # Інші параметри команди являють собою список кодів товарів. # Цикл, який виконується доти, поки залишаються # неопрацьовані параметри. while [ $# -ne 0 ] do # ===================================================== # Код товару запам'ятовується в змінній і записується у файл code=$1 echo "$code" >$HOME/temp02 # ===================================================== # КОНВЕЄР 1 # ===================================================== # У файлі query5 віддаляються зайві пробіли sed -n 's/ */ /gp' /home/metod/query5 | # ===================================================== # Вибираються стовпці: код замовлення, код товару, кількість cut -f2,3,5 -d' ' | # ===================================================== # Сортування по коду товару sort +1 -2 -t' ' |       # ===================================================== # З'єднання з файлом - кодом товару join -j1 2 -j2 1 -t' ' - $HOME/temp02 | # ===================================================== # Вибираються стовпці: код замовлення, кількість # (код товару більше не потрібний) cut -f2,3 -d' ' | # ===================================================== # Сортування по коду замовлення й збереження у файлі sort +0 -1 -t' ' >$HOME/temp03       # # ===================================================== # КОНВЕЄР 2 # ===================================================== # У файлі query4 віддаляються зайві пробіли sed -n 's/ */ /gp' /home/metod/query4 | # ===================================================== # Вибираються стовпці: код замовлення, дата cut -f1,4 -d' ' | # ===================================================== # Сортування по коду замовлення sort +0 -1 -t' ' | # ===================================================== # З'єднання з файлом - місяцем sed -n '/'$mon'/p' | # ===================================================== # Вибирається стовпець коду замовлення # (дата більше не потрібна) cut -f1 -d' ' | # ===================================================== # Сортування по коду       sort +0 -1 -t' ' | # ===================================================== # З'єднання з файлом замовлень по заданому товару       join -j1 1 -j2 1 - $HOME/temp03 | # ===================================================== # Вибирається стовпець кількості cut -f2 -d' ' >$HOME/temp01 # ===================================================== # Початкове значення суми - 0 sum=0 # ===================================================== # Уміст файлу temp01 составляеn список циклу for for value in `cat $HOME/temp01`   do   # ===================================================   # Підсумовування елементів списку   sum=`expr "$sum" + "$value"`         done # ===================================================== # Вивід результату echo "Продане товару $code в $mon - $sum шт." # ===================================================== # Зрушення списку параметрів shift # ===================================================== # Кінець циклу перебору параметрjв done # ======================================================= # Після виходу із циклу - видалення тимчасових файлів rm $HOME/temp01 rm $HOME/temp02 rm $HOME/temp03 # ======== Кінець скрипта ex7_3 ================================= #

Зразок виконання створеної команди:



Поделиться:


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

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