We wszystkich zadaniach proszę zadbać o maksymalnie proste implementacje. Czyli, gdy mamy już skrypt lub wyrażenie, które realizuje funkcje wymagane w zadaniu, to następnie należy zastanowić się, czy nie jest ono nadmiarowe, czy nie ma w nim bałaganu, który warto byłoby wyeliminować, itp. Napisane minimalistycznie skrypty o wiele łatwiej czytać, a co za tym idzie dostosować do innych wymagań w razie potrzeby.

Proszę również zadbać o dyscyplinę w tworzeniu plików. Jeśli w zadaniu nie jest podane inaczej, to wynik należy wyświetlić na wyjściu (stdout). Nie należy tworzyć plików tymczasowych jeśli nie jest to potrzebne. Jeśli plik tymczasowy jest konieczny, to należy go utworzyć w poprawny i bezpieczny sposób, i po użyciu posprzątać.

  1. Napisz wyrażenie seda zamieniające w pliku wejściowym komentarze w stylu C++ (//...) na komentarze w stylu C (/* ... */). Nie zależy nam na całkowicie poprawnym parsowaniu składni tych języków (z makrodefinicjami, itp.), tylko na prostym przetwarzaniu komentarzy. Jednak jeśli potrafisz napisać wyrażenie dokładniej wykrywające prawdziwe komentarze, to zrób to.

  2. Napisz skrypt w awk-u, który sprawdzi wejściowy plik tekstowy i wyświetli na wyjściu wszystkie wiersze, które zawierają powtórzenie słowa, czyli słowo identyczne z poprzednim. W odróżnieniu od wersji takiego skryptu napisanego w sedzie (przedstawionej na wykładzie), ta wersja powinna również wykryć powtórzenie słowa w kolejnym wierszu.

  3. Plik zawiera listę studentów w formacie:
    Imię_1 Nazwisko_1 Numer_1 inne informacje ...
    Imię_2 Nazwisko_2 Numer_2 inne informacje ...
    Imię_3 Nazwisko_3 Numer_3 inne informacje ...
    itd.
    

    Proszę napisać skrypt w awk-u sprawdzający, czy wszystkie wiersze odnoszące się do tego samego numeru mają dokładnie to samo imię i nazwisko. Na wyjściu powinny pojawić się wszystkie wiersze z wejścia (bez zmian), oraz dodatkowy komunikat dla każdego wiersza, który zawiera numer już wcześniej przetworzony, ale z innym imieniem i/lub nazwiskiem. Powtarzające się imiona i nazwiska z różnymi numerami są OK.

  4. Zakładamy, że w szeregu plików mamy wyniki zaliczeń studentów z kolejnych ćwiczeń. Pliki mają format CSV (Comma Separated Values), każdy wiersz dotyczy w nich jednego studenta, i w kolejnych polach zawiera: Imię, Nazwisko, Numer, Ocena, Komentarz. Ocena jest liczbą nieujemną w jakimś nieznanym przedziale, być może z częścią ułamkową po kropce. Zakładamy, że każdy wiersz zawiera poprawne pierwsze trzy pola, to znaczy, jeśli jest wiersz z danym numerem studenta, to zawiera on również jego poprawne imię i nazwisko. (Ale to nie oznacza, że wiersz w innym pliku, który zawiera to samo imię i nazwisko, dotyczy tego samego studenta. Unikalny jest tylko numer, imiona i nazwiska mogą się powtarzać.) Pola od czwartego mogą być puste. W każdym pliku może również brakować wiersza danego studenta.

    Proszę napisać skrypt w awku, który przetworzy wszystkie pliki zadane jako argumenty wywołania, i obliczy wyniki sumaryczne dla wszystkich studentów i wywietli je na wyjściu w postaci:

    Imię,Nazwisko,Numer,StudWyn,MaxWyn,Suma
    
    gdzie StudWyn oznacza liczbę znalezionych zaliczeń tego studenta, MaxWyn ocznacza liczbę wszystkich otrzymanych plików z wynikami zaliczeń (ta liczba będzie identyczna dla wszystkich studentów), a Suma oznacza sumę wyników studenta.

  5. W dwóch oddzielnych plikach o formacie jak w poprzednim zadaniu mamy listy zaliczeń grupy studentów. Jeden plik zawiera oceny z wykładu (kolokwium), a drugi z pracowni. W tym przypadku oceny są w skali od 2 do 5, z normalnymi ocenami połówkowymi.

    Proszę napisać skrypt, któremu podane zostaną nazwy powyższych dwóch plików jako argumenty, i który obliczy i wyświetli na wyjściu sumaryczną listę zaliczeń, ładnie sformatowaną, z wynikami zaliczeń zarówno pracowni jak i kolokwium, oraz oceną końcową obliczoną następująco:

    Konwencja pozwala, by każdy z dwóch plików wejściowych (ale nie oba naraz) mógł być zadany w postaci minusa, co oznacza, że dany plik należy czytać z wejścia.

    Pliki należy połączyć programem join, a wyniki obliczać awkiem. Wykorzystaj mechanizm przekazywania wartości zmiennych z wiersza argumentów do skryptu awka.