Wstęp do systemów wielozadaniowych laboratorium 19 — awk
Jarosław Piersa
Wydział Matematyki i Informatyki, Uniwersytet Mikołaja Kopernika
2013-01-08
Ćwiczenia Zadania domowe
Idea Elementy języka
Idea
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; }
J. Piersa WSWZ 2012/2013 Laboratorium 19
Prosty przykład
awk ’//{ print $0; } ’ ścieżka/do/pliku awk -f skrypt ścieżka/do/pliku
Ćwiczenia Zadania domowe
Idea Elementy języka
Ćwiczenie 1
Napisz polecenie AWK, które wyświetli całą zawartość pliku między liniami piątą a dziesiątą
J. Piersa WSWZ 2012/2013 Laboratorium 19
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
Ćwiczenia Zadania domowe
Idea Elementy języka
Ćwiczenie 2
Napisz polecenie AWK, które wyświetli całą zawartość pliku między liniami piątą, a dziesiątą
J. Piersa WSWZ 2012/2013 Laboratorium 19
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
Ćwiczenia Zadania domowe
Idea Elementy języka
Ćwiczenie 3
wyświetl ile wierszy i rekordów w każdym z wierszy ma plik passwd(ten rozszerzony)
J. Piersa WSWZ 2012/2013 Laboratorium 19
Zmienne c.d.
{zm = wartość;} — w awk można stosować zmienne (bez deklaracji)
{zm = $1 + $5; print zm;} — operacje na zmiennych w stylu C
Ćwiczenia Zadania domowe
Idea Elementy języka
Ć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
J. Piersa WSWZ 2012/2013 Laboratorium 19
Instrukcja warunkowa
instrukcja warunkowa (składnia w stylu c):
/[0-9]*/ {
if (zm == 2 && a <= 4 ) { instrukcja1 ;
} else {
instrukcja2 ; } # if
} # akcja
Ćwiczenia Zadania domowe
Idea Elementy języka
Ć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
J. Piersa WSWZ 2012/2013 Laboratorium 19
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
Ćwiczenia Zadania domowe
Idea Elementy języka
Ć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")
J. Piersa WSWZ 2012/2013 Laboratorium 19
Funkcje
Funkcje:
function sqr( n ) { return n * n;
}
Ćwiczenia Zadania domowe
Idea Elementy języka
Tablice
Tablice:
tabl[ indeks ] = 1;
J. Piersa WSWZ 2012/2013 Laboratorium 19
Ć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
Ćwiczenia Zadania domowe
Idea Elementy języka
Tablice hashowane
tablice mogą być indeksowane napisami:
tabl[ "ala ma kota"] = 1;
iterowanie po tablicach hashowanych for (slowo in tablica ) {
print slowo tablica[slowo]
}
J. Piersa WSWZ 2012/2013 Laboratorium 19
przeanalizuj skrypt
posortuj kolejność wypisywania BEGIN{ t a b [ ” A l a ” ] = 0 ;
t a b [ ” Ola ” ] = 0 ; }
/ [ aA ] l a /{ t a b [ ” A l a ” ]++; } / [ Oo ] l a /{ t a b [ ” Ola ” ]++; } END{
f o r ( i m i e i n t a b ) {
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 ” , i m i e , t a b [ i m i e ] ) ;
} # f o r }
Ćwiczenia Zadania domowe
Idea Elementy języka
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
J. Piersa WSWZ 2012/2013 Laboratorium 19
Ć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ć zsub()
Ćwiczenia
Zadania domowe 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: ax2+ 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.
J. Piersa WSWZ 2012/2013 Laboratorium 19
Zadanie domowe 2 — Oceniacz
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ęć
Ćwiczenia
Zadania domowe 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.
J. Piersa WSWZ 2012/2013 Laboratorium 19
Źródła
http://www.gnu.org/software/gawk/
http://www.sunsite.ualberta.ca/Documentation/Gnu/
można szukać również pod nazwami nawk lub gawk