Kierunek informatyka Wprowadzenie do języka awk



Pobieranie 41.11 Kb.
Data03.05.2016
Rozmiar41.11 Kb.
Podstawy Technik Komputerowych

Kierunek informatyka

Wprowadzenie do języka AWK


Zad 1)


Zalogować się na venus.wsb-nlu.edu.pl. Utworzyć plik tekstowy o nazwie pracownicy.dat zawierający kilka wierszy opisujących osoby, stawki godzinowe i ilość wykonanych godzin:

Pracownicy.dat


Jan Nowak 3.5 30

Tom Blake 2.5 30

Alfred Aho 5.5 40

Brian Kerninghan 6.25 45

Peter Weinberger 5.0 38

Anna Urbaniec 2.5 0


Separatorami poszczególnych pól w wierszu mogą być spacje lub znaki tabulacji.

Proste programy w języku AWK składają się z sekwencji następujących wyrażeń:



warunek { akcja }

warunek { akcja }

...

Program wypisujący z powyższego pliku nazwiska pracowników, który stawka godzinowa jest większe niż 4.0 wygląda następująco:

$3 > 4 { print $2 }

Aby wykonać taki program z plikiem pracownicy.txt jako zbiorem danych piszemy w linii poleceń:

awk ‘$3 > 4 { print $2 }’ pracownicy.dat
Proszę zwrócić uwagę na apostrofy!

Wykonując ten program interpreter języka AWK przegląda kolejno wiersz po wierszu pliku danych. Każdy wiersz traktowany jest jak zbiór pól oznaczanych kolejno zmiennymi $1, $2 itd. Separatorami pól są domyślnie spacje i znaki tabulacji


Zad 2.)

Wypisz nazwiska pracowników oraz należne im wypłaty:

awk ‘{ print $2, $4*$4}’ pracownicy.dat

lub


awk ‘{ print ”Wypłata dla ”, $2, ”wynosi ”, $4*$4}’ pracownicy.dat
Proszę zwrócić uwagę, że w tym przykładzie nie występuje żaden warunek. Oznacza to, że akcje są wykonywane dla każdego wiersza pliku danych.
Zad 3.)

Wbudowane zmienne: NF i NR. Zmienna NF zawiera liczbę pól w aktualnie przetwarzanym wierszu; NR zlicza ilość wierszy już wczytanych.

Uruchom:

awk ‘{ print NF, $1, $NF}’ pracownicy.dat

awk ‘{ print NR, $0 }’ pracownicy.dat
Zwrócić uwagę na konstrukcję: $NF oraz na zmienną $0 (aktualny wiersz).
Zad 4.)

Wypisać dane dane o wypłatach oraz posortować rosnąco wg Wypłat:

awk ‘{ print $3*$4, $0 }’ pracownicy.dat | sort

Użyliśmy w tym poleceni potoku: wyjście z jednego programu zostało skierowane na wejście następnego.


Zad 5.)

Wypisać pracowników, których wypłata będzie większa niż 120.

awk ‘$3*$4 > 120 { print $2, $3*$4 }’ pracownicy.dat
Wypisać dane o Nowaku:

awk ‘$2 == ”Nowak” { print $0 }’ pracownicy.dat


Zad 6.)

Proste warunki można łączyć w bardziej złożone dzięki operatorom logicznym: || (alternatywa) oraz && (koniunkcja)., ! (zaprzeczenie).

Wypisać nazwisko i stawki osób ze stawką na godzinę w przedziale 4.0 do 6.0:

awk ‘$3 >= 4 && $3 <= 6 { print $2, $3 }’ pracownicy.dat


Wypisać dane o wszystkich z wyjątkiem Nowaka:

awk ‘$2 != ”Nowak” { print $0 }’ pracownicy.dat


Zad 7.)

Jeżeli chcemy aby jakaś akcja została wykonana tylko raz, na samym początku przetwarzania pliku z danymi, zanim jeszcze zostanie wczytany pierwszy wiersz danych musimy użyć jako warunku specjalnego słowa kluczowego BEGIN.

Tym raz program zapiszemy w osobnym pliku a potem go przywołamy. W takim przypadku składnia wywołania AWK’a jest następująca:

awk -f progfile plik1.dat …


Gdzie progfile jest nazwą pliku zawierającego program w AWK’u a następnie podajemy nazwy plików z danymi. Bardzo często rozszerzeniem nazwy pliku z programem w języku AWK jest .awk.
Stworzyć plik zad7.awk o treści:

BEGIN { print ”IMIĘ NAZWISKO STAWKA GODZINY; print ”” }

{ print $0 }
Wykonać ten program:

awk -f zad7.awk pracownicy.dat


Proszę zwrócić uwagę, że możemy podać kilka akcji w nawiasach {}. Oddzielamy je wtedy średnikami. Ponadto instrukcja: print ”” powoduje wypisanie jednego pustego wiersza.
Zad 8.)

Słowo kluczowe END funkcjonuje podobnie jak BEGIN, z tym że akcja wykonuje się tym razem po przetworzeniu wszystkich wierszy pliku.

Zliczyć ilu jest pracowników, którzy przepracowali więcej niż 40 godzin:

$3 > 40 { count = count + 1 }

END { print count, “pracowników przepracowało więcej niż 40 godzin” }
Wykonać powyższy program. Proszę zwrócić uwagę na pojawienie się zmiennej count. Zmienne w AWK’u nie muszą być deklarowane. Występują dwa typu zmiennych: tekstowe (łańcuchy znaków) oraz liczbowe (bez podziału na typy zmienno- i stałoprzecinkowe).
Zad 9.)

Program liczący liczbę pracowników, całkowitą płacę oraz średnią płac:

Utworzyć plik zad9.awk:

{ pay = pay + $3*$4 }

END { print NR, ”pracowników”

print ”całkowita płaca wynosi:”, pay

print ”średnia płaca wynosi:”, pay/NR

}
Uruchomić program:

awk –f zad9.awk pracownicy.dat


Zad 10.)

Dużą zaletą AWK’a jest łatwość operowania na łańcuchach znaków.

Napisać program znajdujący pracownika o największej stawce godzinowej.

$3 > max { max = $3; name = $2 }

END { print “największa stawka na godzinę:”, max, “dla”, name }
Uruchomić ten program.
Zad 11.)

Sklejanie (konkatenacja) tekstów.

Operację konkatenacji łańcuchów uzyskujemy pisząc obok siebie dane łańcuchy, np.

names = names $2 ” ”.

Zgromadzić nazwiska wszystkich pracowników w jednym łańcuchu, a następnie go wypisać:

{ names = names $2 ” ” }

END { print names }
Uruchomić ten program.
Zad 12.)

Język AWK dysponuje pewna liczbą wbudowanych funkcji. Przykładowo funkcja length() zwraca liczbę znaków w łańcuchu.

Napisać program zliczający wiersze, słowa i znaki w danym pliku. Zmienna $0 przechowuje aktualnie przetwarzany wiersz.

Utworzyć plik wc.awk o treści:



{ nc = nc + length($0) + 1

nw = nw + NF

}

END { print NR, “wierszy,”, nw, “słów,”, nc, “znaków” }
Wykonać program wc.awk:

awk -f wc.awk pracownicy.dat


Dlaczego w programie dodajemy 1 w instrukcji nc = nc + length($0) + 1?
Zad 13.)

W AWK’u można używać tablic. Odwołanie się do i-tego elementu tablicy tab ma klasyczną postać: tab[i].

Napisać program, który wypisze wiersze podanego pliku w odwrotnej kolejności.

Utworzyć plik reverse.awk o następującej treści:

{ lines[NR]= $0 }

END { i = NR

while (i > 0) {

print lines[i]

i = i – 1

}
Przetestować ten program, np.:

awk -f reverse.awk pracownicy.dat
Proszę zauważyć, że w programie powyższym użyto pętli sterującej while(). Jej składnia jest podobna do składni pętli while w języku C. W języku AWK również wystepuje pętla for() o składni podobnej do tej z języka C. Oto powyższy przykład przy użyciu petli for().

Utworzyć plik reverse2.awk o treści:

{ lines[NR]= $0 }

END { for(i = NR; i > 0; i = i – 1)

print lines[i]

}
Uruchomić i przetestować ten program.


Zad 14.) QIUZ

Postaraj się odpowiedzieć co robią poniższe króciutkie programy w AWK’u.




  1. END { print NR }

  2. NR = = 10

  3. { print $NF }

  4. { f = $NF }

END { print f }

  1. NF > 4

  2. { nf = nf + NF }

END { print nf }

(7) /Tom/ { nl = nl + 1 }

END { print nl }


  1. $1 > max { max = $1; line = $0 }

END { print max, line }

  1. NF > 0

  2. length(8) > 80

  3. { print $2, $1 }

  4. { tmp = $1; $1 = $2; $2 = tmp; print }

  5. { $2 = “”; print }

  6. { for (i = NF; i > 0; i = i – 1) print $i

print “\n”

}


  1. { sum = 0

for (i = 1; i <= NF; i = i + 1) sum = sum + 1 }

print sum



}

  1. { for (i = 1; i <= NF; i = i + 1) sum = sum + $i }

END { print sum }
: ~szyszkin -> ptk -> inf




©absta.pl 2019
wyślij wiadomość

    Strona główna