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.
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".
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
Polecana dokumentacja i tutoriale dotyczące wyrażeń regularnych,
sed
-a i awk
-a:
man sed
(na początek)Przykłady użycia sed
-a i awk
-a:
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).