Wstęp do systemów wielozadaniowych laboratorium 19 awk Jarosław Piersa Wydział Matematyki i Informatyki, Uniwersytet Mikołaja Kopernika 2013-01-08
Język programowania do pracy z bazami danych (w formie tekstowej) wiersz w pliku = rekord słowa w danym wierszu = pola rekordu awk przegląda każdy wiersz, jeżeli dopasuje go do wzorca, to wykonuje akcję ogólna składnia: wzorzec { akcja; }
Prosty przykład awk //{ print $0; } ścieżka/do/pliku awk -f skrypt ścieżka/do/pliku
Ćwiczenie 1 Napisz polecenie AWK, które wyświetli całą zawartość pliku między liniami piątą a dziesiątą
Wzorzec BEGIN przed pierwszą linią END po ostatniej linii END po ostatniej linii /wyrażenie regularne / dopasowane wyrażenia NR==10 numer rekordu (wiersza)! wzorzec negacja warunku wzorzec A wzorzec B alternatywa warunków wzorzec A && wzorzec B koniunkcja warunków
Ćwiczenie 2 Napisz polecenie AWK, które wyświetli całą zawartość pliku między liniami piątą, a dziesiątą
Zmienne FS separator pól RS separator rekordów OFS ORS separator rekordów i rekordów w pliku wyjściowym NF ilość pól w bieżącym rekordzie NR numer bieżącego rekordu $0 cały rekord $1 $2 pole pierwsze, pole drugie FILENAME przetwarzany plik
Ćwiczenie 3 wyświetl ile wierszy i rekordów w każdym z wierszy ma plik passwd (ten rozszerzony)
Zmienne c.d. {zm = wartość;} w awk można stosować zmienne (bez deklaracji) {zm = $1 + $5; print zm;} operacje na zmiennych w stylu C
Ćwiczenie 4 napisz polecenie, które wyświetli w każdym wierszu sumę pól piątego i szóstego napisz polecenie, które wyświetli sumę wszystkich pól piątych i sumę pól szóstych w całym pliku
Instrukcja warunkowa instrukcja warunkowa (składnia w stylu c): /[0-9]*/ { if (zm == 2 && a <= 4 ) { instrukcja1 ; } else { instrukcja2 ; } # if } # akcja
Ćwiczenie 5 napisz polecenie, które obliczy w ilu wierszach suma pól piątego, szóstego i siódmego jest większa niż 22, a w ilu mniejsza
Pętla Pętla for (składnia w stylu c): /[0-9]*/ { for (i=2 ; i<8 ; i++ ) { instrukcja1 ; } # for } # akcja Pętla while: /[0-9]*/ { while (a+1!= 10 ) { a++;; } # while } # akcja
Ćwiczenie 6 napisz polecenie, które wczyta z pliku liczbę n 2, a następnie narysuje na wyjściu trójkąt prostokątny o wysokości i podstawie równej n. np: n = 4: * ** * * **** wskazówka: użyj printf zamiast print (łamanie linii poprzez: printf "napis\nnapis2")
Funkcje Funkcje: function sqr( n ) { return n * n; }
Tablice Tablice: tabl[ indeks ] = 1;
Ćwiczenie Napisz skrypt awk, który zliczy ilość liczb w każdym wierszu a następnie wypisze te liczby posortowane wskazówka: wykorzystaj jako separator pól odpowiednie wyrażenie regularne
Tablice hashowane tablice mogą być indeksowane napisami: tabl[ "ala ma kota"] = 1; iterowanie po tablicach hashowanych for (slowo in tablica ) { print slowo tablica[slowo] }
przeanalizuj skrypt posortuj kolejność wypisywania BEGIN{ tab [ Ala ] = 0 ; tab [ Ola ] = 0 ; } / [ aa ] l a /{ tab [ Ala ]++; } / [ Oo ] l a /{ tab [ Ola ]++; } END{ f o r ( i m i e i n tab ){ p r i n t f ( i m i e %s w y s t e p u j e %d r a z y, imie, tab [ i m i e ] ) ; } # f o r }
Operacje na napisach index(string, substring ) length(string ) split (string, tab ) podział napisu na tablicę według zmiennej FS (może być wyrażenie regularne) substr(string, start ) podnapis od pozycji start do końca substr(string, start, koniec ) podnapis od pozycji start długości k znaków
Ćwiczenie dana niech będzie tablica hashowna: tab["ala"]="alice"; tab["ma"]="has"; tab["kota"]="a kitty"; napisz prosty translator, który słowo po słowie zmienia wyrazy polskie na angielskie (o ile ma tłumaczenia w słowniku) jeżeli nie ma tłumaczenia, to pozostawia słowo bez zmian wynik wypisze na stdout można skorzystać z sub()
Zadanie 1 Zadanie domowe 1 Trójmian kwadratowy Napisz skrypt w awk, który zostanie wykonany na pliku, który zawiera po trzy liczby w wierszu (pierwsza niezerowa): a b c dla każdego wiersza: potraktuje te liczby jako współczynniki trójmianu: ax 2 + bx + c obliczy i wypisze pierwiastki rzeczywiste (jeśli są dwa), pierwiastek (jeśli jeden), lub informację o ich braku na koniec podsumuje, ile trójmianów miało po dwa, jeden lub brak pierwiastków rzeczywistych wskazówka: pierwiastek kwadratowy: sqrt() punktacja: 1p.
Zadanie domowe 2 Oceniacz Zadanie 1 z arkusza z wynikami z przedmiotu (na moodle) wyeksportuj arkusz drugi (z punktacją) jako plik csv, wskazówka: eksportując można wybrać separator pól (zalecany) oraz opcję cytowania napisów (zalecane bez) napisz skrypt, który automatycznie przeanalizuje arkusz, wystawi oceny i wypisze wyniki np: Pan/i Nazwisko Imię Punktacja Ocena oraz na koniec podsumuje ile jest poszczególnych ocen: np wystawionych ocen NDST: 0 (mam nadzieję JP) można pominąć osoby, które są skreślone z zajęć punktacja: 1p.
Zadanie 1 Zadanie domowe 3 Analiza logów napisz skrypt, który przeanalizuje plik z logami aktywności uczestników kursu na moodle skrypt dla każdego uczestnika obliczyć jego całkowitą aktywność w kursie, a następnie wypisać podsumowanie: Pan/i Nazwisko Imię aktywność, posortowane malejąco (wg aktywności) UWAGA: z logów wycięte są adresy IP i godziny punktacja: 1p.
Źródła Zadanie 1 http://www.gnu.org/software/gawk/ http://www.sunsite.ualberta.ca/documentation/gnu/ można szukać również pod nazwami nawk lub gawk