Poniższe zadania powinny być rozwiązane przy użyciu narzędzi systemu Unix (Solaris - diablo). Jeśli nie potrafisz napisać rozwiązania poprawnego na Uniksie, i udało Ci się jedynie uruchomić swoje rozwiązanie pod Linuksem - zaznacz to w raporcie. Takie rozwiązanie będzie tolerowane, choć w niektórych przypadkach może być niżej ocenione.

Przygotowanie do zajęć

W przypadku tej listy konieczne jest zapoznanie się z programami sed i awk. Wymaga to poczytania przynajmniej pobieżnie jakichś podręczników. Nie wystarczy zwykła dokumentacja systemowa man.

Uwaga na różne wersje tych programów, w szczególności wersje uniksowe i wersje GNU. Większość opisów znajdowanych w necie dotyczy wersji GNU, które są bardziej rozbudowane. Konieczne jest sprawdzanie wszystkich konstrukcji na Uniksie aby mieć pewność, że są poprawne.

Kilka dobrych opracowań na temat sed-a i awk-a i wybór przykładów ich użycia można znaleźć poniżej w sekcji "Przydatne materiały".

Wykonanie ćwiczenia

Zad.1. (1 punkt - na zajęciach)
Napisz instrukcję pętli shella, która wykorzystując program sed zamieni nazwy wszystkich plików w katalogu bieżącym mających w nazwie spacje na podkreślenia.

Zad.1a. (1 punkt - w domu)
Zmodyfikuj wywołanie sed-a tak by sekwencje kilku/wielu spacji były zamienione na pojedynczy znak podkreślenia.

Zad.2. (1 punkt - na zajęciach)
Napisz wyrażenie sed-a wykorzystujące polecenie s, które zamieni pierwszy wyraz (niepusty ciąg liter) każdego wiersza na ten sam wyraz w nawiasach okrągłych. Cała treść wiersza przed pierwszym wyrazem, oraz po nim, pozostaje niezmieniona.

WSKAZÓWKA: proste i dobre rozwiązanie tego zadania wymaga użycia mechanizmu zapamiętywania wyrażeń BRE.

Uwaga: aby w pełni sprawdzić napisane wyrażenie, stwórz plik testowy zawierający kilka wierszy po kilka słów w wierszu, ale jednocześnie zawierający wiersz pusty, oraz taki wiersz, w którym słowa będa poprzedzone innymi znakami: (a) spacjami, (b) znakami numerycznymi i przestankowymi.

Zad.3. (2 punkty - na zajęciach, lub 1 punkt - w domu)
Napisz wywołanie sed-a (tylko wyrażenie, skrypt niepotrzebny), które zmodyfikuje bieżącą wartość zmiennej środowiskowej PATH w taki sposób, aby usunąć z niej wystąpienia katalogu /usr/games

Na przykład, jeśli wartość PATH wynosiła:

/usr/bin:/bin:/usr/games

to wynikiem wykonania instrukcji powinno być:

/usr/bin:/bin

Sposób wywołania opracowanego wyrażenia sed-a:

PATH=`echo $PATH | sed ...`

Uwaga: Katalogi w ścieżce PATH oddzielone są średnikami. Chcemy wraz z usuwanym katalogiem /usr/games usunąć również towarzyszący mu średnik.

Zad.4. (2 punkty - na zajęciach, lub 1 punkt - w domu)
Plik zawiera zestaw operacji w formacie CSV (comma-separated values) na danym koncie bankowym (właściciela):

data operacji,data ksiegowania,numer konta operacji,kwota operacji,opis slowny operacji,saldo

Należy napisać skrypt awk-a o nazwie saldo.awk do przetwarzania takich plików w celu sprawdzania poprawności salda. Po wczytaniu każdego wiersza, poza pierwszym, program powinien obliczyć, czy saldo zawarte w tym wierszu jest zgodne z bieżącą operacją, oraz poprzednim saldem. Gdy saldo jest zgodne, program pomija operację bez komentarzy. Gdy saldo się nie zgadza, program wyświetla stosowny komunikat zawierający numer wiersza z błędem salda.

Na przykład, dla poniższego zestawu operacji, pierwszy wiersz z definicji nie generuje żadnych komentarzy, ponieważ jego saldo jest przyjmowane jako stan początkowy, drugi wiersz nie generuje komentarzy, ponieważ saldo jest poprawne po zaksięgowanej wypłacie 350.00, natomiast trzeci wiersz powinien wygenerować komentarz o błędzie operacji, ponieważ saldo po wypłacie 1000.00 powinno być 695.17 a jest 695.16

24-12-2013,26-12-2013,1234567,1037.33,przelew wynagrodzenia,2045.17
28-12-2013,30-12-2013,9876543,-350.00,wyplata gotowki w kasie,1695.17
29-12-2013,31-12-2013,1357986,-1000.00,splata raty kredytu,695.16

Zad.5. (2 punkty - w domu)
Plik zawiera listę ocen punktowych grupy studentów z wielu ćwiczeń w formacie:

Imię Nazwisko Numer punkty nr_cwiczenia inne informacje ...

Na przykład:

Jacek Kowalski 123456 10 1 wszystkie punkty zrobione
Jacek Kowalski 123456 5 2
Zuza Nowak 654321 3 1 minimalnie zrobione zadanie
Zuza Nowak 654321 10 2 wzorowo
Jacek Placek 224466 10 3 podejrzanie dobre zadanie

Napisz w awk-u skrypt sumuj.awk sumujący punkty przyznane studentom. Studentów należy identyfikować według numeru w polu 3, i po każdym napotkanym wierszu dotyczącym danego studenta, sumować zebrane punkty.

Po zakończeniu przetwarzania pliku wejściowego, należy wyświetlić ładnie sformatowaną listę studentów: imię, nazwisko, numer, oraz sumaryczną liczbę punktów.

Wskazówka: należy użyć tablic awk-a. Te tablice mogą być indeksowane dowolnymi danymi (np. numerami indeksu studentów) i nazywane są tablicami asocjacyjnymi. Warto przejrzeć kilka przykładów użycia tablic asocjacyjnych w awk-u.

Wynikowy skrypt dołączony do raportu powinien zawierać czysty program awk wywoływany poleceniem awk -f sumuj.awk

Zad.6. (2 punkty - w domu)
Dla pliku danych z wynikami studentów o formacie jak w poprzednim zadaniu, napisz w awk-u skrypt sprawdzaj.awk do sprawdzenia zgodności imion i nazwisk z numerami. Jako identyfikator traktujemy numer indeksu w trzecim polu. Skrypt ma sprawdzać, czy każde kolejne wystąpienie wiersza z tym samym numerem ma imię i nazwisko (pierwsze dwa pola) takie samo jak poprzednio. Gdy tak jest, skrypt nie wyświetli nic na wyjściu. Jednak gdy napotkamy wiersz, z wcześniej już znalezionym numerem, ale z różniącym się imieniem LUB nazwiskiem, należy wyświetlić komunikat informacyjny, identyfikujący numer wiersza (zmienna NR w awk).

Wynikowy skrypt dołączony do raportu powinien zawierać czysty program awk wywoływany poleceniem awk -f sprawdzaj.awk

Przydatne materiały internetowe

Polecana dokumentacja i tutoriale dotyczące wyrażeń regularnych, sed-a i awk-a:

Przykłady użycia sed-a i awk-a:

Raport

Raport z wykonanego zadania powinien zawierać listę punktów zadania z adnotacją "WYKONANE", i ewentualnie, w razie potrzeby, z dodatkowymi uwagami. Skrypty opracowane do punktów 4, 5 i 6 proszę dołączyć jako oddzielne pliki o nazwach zadanych w kolejnych punktach zadania, natomiast opracowane wyrażenie/a proszę wkleić do raportu w odpowiednim punkcie.
Zwróć uwagę, by skrypty nie zawierały odwołań do Twoich własnych katalogów, a operowały np. tylko na katalogu bieżącym (ub zadanym w zadaniu).