Bazy danych, zadania domowe 1 (2003)
Uczestnicy ćwiczeń z Wprowadzenia do Baz Danych powinni wykonać po co najmniej dwa
z poniższych pięciu zadań, a planujący uzyskać zaliczenie na 5 - trzy zadania.
Rozwiązania proszę przysyłać pocztą elektroniczną na adres prowadzącego zajęcia
do 1 grudnia br.
Proszę o powstrzymanie się od reklamacji dotyczących konieczności użycia poleceń shella
czy funkcji AWK-a nie omówionych na zajęciach: jednym z celów zadań jest wyrobienie
umiejętności i nawyku szukania rozwiązań w dokumentacji!
-
Napisać skrypt (AWK) który, traktując strumień wejściowy
jako ciąg rekordów złożonych z pól, wypisze na końcu liczbę przeczytanych rekordów,
minimalną, maksymalną oraz średnią (arytmetyczną) długość rekordu w znakach (całkowitą tj.
łącznie z separatorami pól), oraz odpowiednie wielkości (minimalną, maksymalną
i średnią długość) dla pola pierwszego, drugiego, ... NIE zakładamy, że liczba pól
w rekordzie jest stała dla całego strumienia.
Wyliczając statystyki dla k-tego pola, nie uwzględniać rekordów składających się z mniej
niż k pól. Pozostawiamy użytkownikowi możliwość podania własnych wartości dla
separatora pól (FS) i/lub separatora rekordów (RS), istnieje zatem możliwość wystąpienia
rekordów gdzie pole $k jest puste, choć NF>=k; takie rekordy
uwzględniamy przy obliczaniu statystyk długości k-tego pola.
-
Napisać skrypt (AWK, shell) który przeformatuje plik tekstowy (lub strumień wejściowy)
według następujących reguł:
-
Strumień wyjściowy będzie składał się z tych samych wyrazów (i w tej samej kolejności)
co dane wejściowe, różniąc się od danych wejściowych jedynie wystąpieniami
,,znaków pustych'' tj. spacji, kodów tabulacji i podziałem na linie.
Każdy ciąg spacji i/lub tabulacji rozdzielający wyrazy zostanie sprowadzony do
pojedynczej spacji.
-
Strumień wyjściowy będzie składał się z linii nie przekraczających długości
60 znaków. Krótsze linie ze strumienia wejściowego zostaną połączone w dłuższe
z sąsiadującymi, lecz bez łączenia linii rozdzielonych liniami pustymi (zawierającymi
co najwyżej spacje i kody tabulacji), i bez dzielenia wyrazów. W przypadku wystąpienia
wyrazu (ciągu znaków nie zawierającego spacji ani tabulacji) przekraczającego
60 znaków, nie będzie on dzielony (ale zacznie się od nowej linii).
-
Każdy ciąg pustych linii (j.w.) zostanie sprowadzony do jednej linii (całkiem) pustej.
-
Napisać skrypt (AWK + shell) dzielący plik (czy strumień) wejściowy na ,,strony'' w następujący sposób:
Na początku strumienia wyjściowego wstawiona zostanie linia postaci
=== plik.txt 1/13 ===
o długości 60 znaków, gdzie plik.txt to nazwa pliku wejściowego
(w przypadku czytania strumienia stdin: napis (STDIN)),
liczby to: 1 - numer aktualnej strony, 13 - całkowita liczba stron w strumieniu
wyjściowym. Analogiczna linia (z odp. wartością numery strony) zostanie wstawiona
co 29 linii wynikowych.
W przypadku korzystania z pliku tymczasowego, proszę użyć polecenia mktemp i pamiętać
o ,,posprzątaniu'', również w przypadku gdy wykonanie skryptu zostałoby przerwane (help trap).
-
Napisać skrypt, posługując się narzędziami shellowymi oraz AWKiem, analizujący
zawartość pliku (kolekcji poczty elektronicznej) w formacie mbox i
wyprowadzający spis treści w postaci:
Lp. | Nadawca | Rozmiar | Temat |
Pola powinny mieć stałą szerokość, jeśli Nadawca lub Temat nie mieści się
w szerokości pola, to urywamy. Jedna linijka dla każdej pozycji (listu).
Lp. to numer kolejny listu w danym mbox-ie, Nadawca - adres nadawcy
wzięty z pola nagłówkowego From:,
Rozmiar to wielkość całego listu (nagłówki + treść) podana w postaci
nn/mmmm - gdzie nn oznacza liczbę linii, a mmmm - liczbę znaków
(bajtów), Temat bierzemy z pola nagłówkowego Subject:.
Należy zwrócić uwagę, by odp. dane pochodziły rzeczywiście z bloku nagłówków listu
(a nie np. z linijek o podobnym kształcie być może występujących w treści listu).
Dla pełnej satysfakcji adres nadawcy powinien być sprowadzony do postaci
user@jakas.domena.
Dla extra punktów dodać pole Data (między Rozmiarem a Tematem) zawierające
datę (z nagłówka Date:) ale sprowadzoną do postaci YYYY-MM-DD HH:MM
z uwzględnieniem strefy czasowej (sprowadzić do strefy lokalnej). UWAGA TO WCALE
NIE TAKIE ŁATWE (jeśli ma działać poprawnie dla znacznego procentu przypadków). Można
tu ewentualnie skorzystać z możliwości wersji GNU (linuxowej) polecenia date,
warto wtedy nauczyć się korzystać z przekierowań potokowych wewnątrz skryptu
w AWK (opisane w manualu info).
-
Napisać skrypt, który wypisze na standardowym wyjściu listę użytkowników mających czynne
w danej chwili procesy na lokalnym komputerze, ale w postaci np.:
jankow: Jan Kowalski, fs00: 5
akowal: Agnieszka Kowalska, mismap01: 11
mkkow: Michal Krzysztof Kowalski, astro99: 1
tzn. podając, obok loginu użytkownika, jego imię (imiona) i nazwisko, nazwę symboliczną grupy
oraz liczbę czynnych procesów. Do uzyskania informacji o procesach wykorzystać polecenie
ps, a danych o użytkownikach - getent (nie ypcat ani
ypmatch).
R. J. Budzyński, 2003-11-03