AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka
Spis treści Wprowadzenie Wzorce Akcje Wejście-wyjście Tablice Funkcje niestandardowe
Copyright, 2003 © Adam Czajka Wprowadzenie Plik wejściowy : Adam Nowak Eugeniusz Słaby Dorota Mądra Piotr Kowalski Zadanie: Policz średnią ocen studentów i wypisz liczbę studentów o średniej co najmniej 4.0.
Copyright, 2003 © Adam Czajka Wprowadzenie Plik wyjściowy : Lp. Indeks Imie Nazwisko | Srednia Adam Nowak | Eugeniusz Słaby | Dorota Mądra | Piotr Kowalski | 4.00 Liczba osób >= 4.0: 3
Copyright, 2003 © Adam Czajka Wprowadzenie Program w AWK : BEGIN { Lp = 1; Num = 0; print Lp. Indeks Imie Nazwisko | Srednia; print ; { srednia = ($4 + $5 + $6) / 3.0; printf(%-4d %-5d %-9s %-8s | %-4.2f\n, Lp, $1, $2, $3, srednia); Lp++; if (srednia >= 4.0) Num++; } END { print Liczba osób >= 4.0:, Num; }
Copyright, 2003 © Adam Czajka Wprowadzenie BEGIN {... akcje... } Wzorzec_1 {... akcje... } Wzorzec_2 {... akcje... } Wzorzec_N {... akcje... } END {... akcje... }... Funkcje_niestandardowe... Ogólna struktura programu :
Copyright, 2003 © Adam Czajka Wprowadzenie Pola w wierszu : Adam Nowak $1 $2 $3$4$5 $6 $0
Copyright, 2003 © Adam Czajka Wprowadzenie Kompilacja programu : Kod źródłowy: plik.awk Dane wejściowe: dane.txt Dane wyjściowe: wyniki.txt gawk –f plik.awk wyniki.txt gawk –f plik.awk < dane.txt gawk –f plik.awk > wyniki.txt gawk –f plik.awk
Copyright, 2003 © Adam Czajka Wzorce Rodzaje wzorców : Wzorce dotyczące początku i końca tekstu wejściowego Wzorce zawierające relacje Wzorce zawierające wyrażenia regularne Wzorce złożone Wzorce zakresu
Copyright, 2003 © Adam Czajka Wzorce Wzorce dotyczące początku i końca tekstu wejściowego: BEGIN { Suma = 0; } { Suma += $1; } END { print Suma; } BEGIN END Zadanie: Napisz program obliczający sumę liczb całkowitych z pliku wejściowego
Copyright, 2003 © Adam Czajka Wzorce Wzorce dotyczące początku i końca tekstu wejściowego: BEGIN { Suma = 0; } { Suma += $1; } END { print Suma; } BEGIN END PROBLEM: Co się stanie jeśli w pliku nie będą tylko liczby ?
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające relacje :, =, ==, != Zadanie: Napisz program wypisujący te wiersze pliku wejściowego, w których pierwsze pole jest większe od drugiego $1 > $2 { print $0; }
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające relacje : Plik wejściowy : dwa 11 Plik wyjściowy : dwa 11
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /wyrażenie_reg/ - wiersz musi zawierać ciąg znaków opisany przez wyrażenie_reg wyrażenie ~ /wyrażenie_reg/ - ciąg znaków będący wartością obiektu wyrażenie musi zawierać ciąg znaków opisany przez wyrażenie_reg wyrażenie !~ /wyrażenie_reg/ - ciąg znaków będący wartością obiektu wyrażenie nie może zawierać ciągu znaków opisanego przez wyrażenie_reg
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /s/ { print $0; } Plik wyjściowy : Eugeniusz Słaby Piotr Kowalski $3 ~ /s/ { print $0; } Plik wyjściowy : Piotr Kowalski
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : ^ - początek pola, dopełnienie zbioru $ - koniec pola. - dowolny znak [ ] - zbiór \ - symbol specjalny ( \b \r \t \n \ \. \ddd ) | - alternatywa ( ) - grupowanie * + - domknięcie ? - operator warunkowy Znaki specjalne :
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /^a$/ { print $0; } /^.$/ { print $0; } /^\.$/ { print $0; } $1 ~ /^a$/ { print $1; } $1 ~ /^...$/ { print $1; } /^.\$/ { print $0; }
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /[ ]/ { print $0; } /[0-9]/ { print $0; } /[^0-9]/ { print $0; } /^[0-9]/ { print $0; } Dopełnienie zbioru Początek wiersza
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /[0-9][0-9]/ { print $0; } /Adam|Piotr/ { print $0; } Program wypisuje wiersze, w których znajdują się liczby dwucyfrowe. Jak zapisać wzorzec dla dowolnej liczby całkowitej ?
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : ε a aa aaa aaaa a* Operator domknięcia
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : a aa aaa aaaa a+ Operator domknięcia dodatniego a+ aa*
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : /[0-9]/ { print $0; } /[0-9]*/ { print $0; } /[0-9]+/ { print $0; } /[0-9][0-9]*/ { print $0; } Pytanie: Jak zapisać liczby rzeczywiste ? /[0-9A-F]+(H|h)/ { print $0; } /[0-9]+(D|d)?/ { print $0; }
Copyright, 2003 © Adam Czajka Wzorce Wzorce zawierające wyrażenia regularne : BEGIN { Suma = 0; } $1 ~ /[0-9]+/ { Suma += $1; } END { print Suma; } Zadanie: Napisz program obliczający sumę liczb całkowitych z pliku wejściowego
Copyright, 2003 © Adam Czajka Wzorce Wzorce złożone : && - koniunkcja || - alternatywa ! - negacja Jeden lub więcej wzorców połączonych operatorami : $2 == Adam || $3 == Kowalski{ print $0; }
Copyright, 2003 © Adam Czajka Wzorce Wzorce zakresu : /wzorzec_1/, /wzorzec_2/ /Adam/, /Nowak/ { print $0; } Plik wyjściowy : Adam Nowak
Copyright, 2003 © Adam Czajka Wzorce Wzorce zakresu : /wzorzec_1/, /wzorzec_2/ /Adam/, /Kowalski/ { print $0; } Plik wyjściowy : Adam Nowak Eugeniusz Słaby Dorota Mądra Piotr Kowalski
Copyright, 2003 © Adam Czajka Akcje Akcja = ciąg instrukcji języka C Pytanie: Co będzie się działo, gdy dla danego wzorca pominiemy akcję ? Np. $2 == Adam Odpowiedź: Akcja pusta jest równoważna akcji: print $0
Copyright, 2003 © Adam Czajka Akcje Akcja = ciąg instrukcji języka C Pytanie: Co będzie się działo, gdy dla danego wzorca pominiemy akcję ? Np. $2 == Adam Odpowiedź: $2 == Adam { print $0 }
Copyright, 2003 © Adam Czajka Akcje W akcjach możemy używać zmiennych: zmiennych nie deklarujemy w sposób jawny deklaracja następuje przez użycie zmiennej BEGIN { Suma = 0; } { Suma += $1; } END { print Suma; }
Copyright, 2003 © Adam Czajka Akcje Zmienne predefiniowane: $0, $1, $2, $3,... – pola wiersza wejściowego ARGC – liczba argumentów w poleceniu gawk.exe ARGV – tablica argumentów FILENAME – nazwa bieżącego pliku wejściowego FNR – liczba wierszy w bieżącym pliku FS – separator pól w pliku wejściowym
Copyright, 2003 © Adam Czajka Akcje Zmienne predefiniowane: NF – liczba pól w bieżącym wierszu NR – numer bieżącego wiersza RS – separator wierszy w pliku wejściowym OFS – separator pól w pliku wyjściowym ORS – separator wierszy w pliku wyjściowym
Copyright, 2003 © Adam Czajka Akcje Wyrażenia: Wyrażenia zbudowane są ze zmiennych i wywołań funkcji przy użyciu operatorów znanych z języka C { zmienna++; } { zmienna = zmienna + 1; } { zmienna = sqrt(number); }
Copyright, 2003 © Adam Czajka Akcje Funkcje predefiniowane: atan2(x, y) – arctg(x/y) cos(x) – cos(x) exp(x) – e x int(x) – [x] log(x) – ln(x) sin(x) – sin(x) sqrt(x) – x
Copyright, 2003 © Adam Czajka Akcje Funkcje predefiniowane: gsub(r, s, t) – każde wystąpienie ciągu r w ciągu t jest zastępowane przez ciąg s gsub(r, s) – gsub(r, s, $0) index(s, t) – indeks pozycji pierwszego wystąpienia ciągu s w t, lub 0 gdy s nie występuje w t length(s) – długość ciągu s
Copyright, 2003 © Adam Czajka Akcje Funkcje predefiniowane: sub(r, s, t) – pierwsze wystąpienie ciągu r w ciągu t jest zastępowane przez ciąg s sub(r, s) – sub(r, s, $0) substr(s, p) – podciąg ciągu s zaczynający się na pozycji p substr(s, p, n) – podciąg ciągu s zaczynający się na pozycji p i mający długość n
Copyright, 2003 © Adam Czajka Akcje Funkcje predefiniowane: split(s, a, f) – zamienia ciąg s na tablicę pól zapisaną w a na podstawie wartości separatora f
Copyright, 2003 © Adam Czajka Akcje Instrukcje : if (wyrażenie) instrukcja if (wyrażenie) instrukcja else instrukcja while (wyrażenie) instrukcja for (wyrażenie; wyrażenie; wyrażenie) instrukcja do instrukcja while (wyrażenie) { ciąg_instrukcji } next
Copyright, 2003 © Adam Czajka Akcje Instrukcje : Zadanie : Napisz program obliczający sumę liczb całkowitych w każdym wierszu pliku wejściowego. W pliku wyjściowym należy przepisać plik wejściowy umieszczając na końcu każdego wiersza po znaku dwukropka obliczoną sumę liczb.
Copyright, 2003 © Adam Czajka Akcje Instrukcje : { suma = 0; for(i=1; i<=NF; i++) { if ($i ~ /[0-9]+/) suma += $i; } printf(%s : %d\n, $0, suma); } Rozwiązanie zadania :
Copyright, 2003 © Adam Czajka Akcje Instrukcje : $2 == Adam { a = 1; next; } $3 == Nowak { a = 2; } next – pomija analizę dalszych wzorców i przechodzi do kolejnego wiersza w pliku wejściowym a = 1
Copyright, 2003 © Adam Czajka Wejście-wyjście Wyjście : print – wypisuje bieżący wiersz print wyr1, wyr2,..., wyrN – wypisuje wyrażenia wyr1, wyr2,..., wyrN a następnie wypisuje znak końca linii. printf(str, arg1, arg2,..., argN) – wypisuje argumenty arg1, arg2,..., argN zgodnie z łańcuchem formatującym str (nie wypisuje automatycznie znaku końca linii)
Copyright, 2003 © Adam Czajka Wejście-wyjście Wyjście do pliku : > nazwa_pliku – tworzy nowy plik o danej nazwie i zapisuje do niego ciąg będący rezultatem działania danej funkcji print >> nazwa_pliku – ciąg będący rezultatem działania danej funkcji print zostanie dołączony na końcu pliku o danej nazwie | polecenie - ciąg będący rezultatem działania danej funkcji print stanowi dane wejściowe dla danego polecenia
Copyright, 2003 © Adam Czajka Wejście-wyjście Zadanie : Każdy wiersz pliku wejściowego ma postać: Imię Nazwisko kwota operacja gdzie operacja = + | - Napisz program, który dla każdej osoby utworzy plik z historią operacji na koncie. Nazwa pliku wynikowego ma postać: nazwisko_imie.txt Wyjście do pliku :
Copyright, 2003 © Adam Czajka Wejście-wyjście { plik = $2 _ $1.txt; print $3, $4 >> plik; } Rozwiązanie zadania : Wyjście do pliku :
Copyright, 2003 © Adam Czajka Wejście-wyjście Wejście z pliku : getline < nazwa_pliku – odczytuje kolejny wiersz z pliku o danej nazwie, przypisuje go do zmiennej $0 i dzieli na poszczególne pola $1, $2,.... getline x < nazwa_pliku – odczytuje kolejny wiersz z pliku o danej nazwie, przypisuje go do zmiennej x (nie ma podziału na pola !!!)
Copyright, 2003 © Adam Czajka Wejście-wyjście Wejście z pliku : Fukcja getline przyjmuje wartości: 1 – gdy wykonanie funkcji zakończyło się pomyślnie 0 – gdy natrafiono na koniec pliku -1 – gdy wystąpiły błędy podczas wykonania funkcji
Copyright, 2003 © Adam Czajka Tablice Własności tablic : Tablic nie deklarujemy w sposób jawny Element tablicy jest tworzony w momencie odwołania się do niego Tablice mają charakter dynamiczny Indeksami tablic mogą być dowolne wyrażenia
Copyright, 2003 © Adam Czajka Tablice { licznik = 0; suma = 0; for (i=$4; i<=NF; i++, licznik++) suma += $i; if (licznik != 0) Srednia[$1] = suma / licznik; } Pytanie: Jak wypisać zawartość tablicy ? Przykład :
Copyright, 2003 © Adam Czajka Tablice END { for (numer in srednia) { print numer, srednia[numer]; } Przykład :
Copyright, 2003 © Adam Czajka Tablice Operacje na tablicach : tablica[x] – odwołanie do elementu tablicy if (indeks in tablica) – sprawdza czy dany indeks istnieje w tablicy for (zmi in tablica) – wykonuje pętlę dla danej tablicy, przypisując do zmiennej zmi wartości kolejnych indeksów tej tablicy delete tablica[x] – usuwa dany element z tablicy
Copyright, 2003 © Adam Czajka Funkcje niestandardowe Deklaracja funkcji niestandardowej : function nazwa(arg1, arg2,..., argN) {.... Instrukcje.... return wyrażenie } Fukcje niestandardowe muszą być umieszczone na końcu programu !
Copyright, 2003 © Adam Czajka Funkcje niestandardowe Deklaracja funkcji niestandardowej : { if (parzysta($1)) print $1, P; else print $1, N; } function parzysta(liczba) { if (liczba % 2 == 0) return 1; return 0; }
Copyright, 2003 © Adam Czajka Podsumowanie Wprowadzenie Wzorce Akcje Wejście-wyjście Tablice Funkcje niestandardowe