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!

  1. 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.
  2. Napisać skrypt (AWK, shell) który przeformatuje plik tekstowy (lub strumień wejściowy) według następujących reguł:
  3. 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).
  4. 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).
  5. 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