C2110 Operační systém UNIX základy programování 11. lekce Petr Kulhánek, Jakub Štěpán kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kotlářská 2, CZ-61137 Brno I f°C'a MINISTERSTVO ŠKOLSTVÍ. op Vzdělávání %^mJ^-S^ ■ TOndVCR EVROPSKÁ UNIE MLÁDEŽE a tělovýchovy pro konkurenceschopnost MAíA^ INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ CZ.1.07/2.2.00/15.0233 )erační systém UNIX a základy programování 11. lekce Obsah > AWK • Co je AWK? • Struktura skriptu, průběh vykonávání • Struktura bloku • Proměnné, operace nad proměnými • Podmínky • Cykly erační systém UNIX a základy programování 11. lekce AWK h tt p://w w w. g n u. o rg/sof t wa re/ga w k/ga w k. h t m I AWK je skriptovací jazyk navržený pro zpracovávání textových dat, ať už v podobě textových souborů nebo proudů. Jazyk využívá řetězcové datové typy, asociativní pole (pole indexovaná řetězcovými klíči) a regulární výrazy. adaptováno z www.wikipedia.org 11. lekce -3- Struktura skriptu AWK BEGIN { } { } /VZOR/ { } END { vykoná se před zpracováním souboru (volitelná sekce) vykoná se pro každý záznam vykoná se pro každý záznam vyhovující VZORu libovolný počet sekcí vykoná se po zpracování souboru (volitelná sekce) Blok je uzavřen do složených závorek {}. Výše uvedené programové bloky jsou volitelné. Ve výchozím nastavení je záznamem řádek souboru. )erační systém UNIX a základy programování 11. lekce Průběh vykonávání skriptu €) BEGIN { } { } /VZOR/ { } END { } Blok BEGIN (1) se vykoná (pokud je ve skriptu obsažen) před analýzou souboru. • Načte se záznam ze souboru. Ve výchozím nastavení je záznamem celý řádek analyzovaného souboru nebo proudu. Záznam se rozdělí na pole. Ve výchozím nastavení jsou pole jednotlivá slova v záznamu. • Pro daný záznam se vykoná blok (2). • Pokud záznamu vyhovuje VZORu, vykoná se blok (3). • .... vykonají se případně další bloky .... Blok END (4) se vykoná (pokud je ve skriptu obsažen) po analýze celého souboru. 11. lekce -5- Analýza textových souborů 54 .7332 295 .7275 128 .4090 -508. 1302 -155 .6037 0 .0000 51 .3204 292 .3619 176 .5980 -494. 7423 -164 .7991 0 .1822 40 .6154 273 .9238 164 .5827 -488. 9232 -163 .0629 0 .3793 52 .5044 281 .5944 153 .4570 -484. 6533 -168 .5328 0 .3528 62 .5486 294 .2701 155 .3607 -483. 6872 -169 .1747 0 .0033 Potential function: ntf = 2, ntb ipol = 0, gbsa dielc = 1.00000, cut 0, igb = 5, nsnb 0, iesp = 0 = 999.00000, intdiel = 1.00000 )erační systém UNIX a základy programování 11. lekce Analýza textových souborů záznam \ pole záznamu 54.7332 295.7275 128.4090 -508.1302 -155.6037 0.0000 3TT37UT 40.6154 52.5044 62.5486 292.Jbiy 273.9238 281.5944 294.2701 i/b.byyu 164.5827 153.4570 155.3607 ■494 . /42J ■488.9232 ■484.6533 ■483.6872 ■164. /yyi ■163.0629 ■168.5328 ■169.1747 pole záznamu / záznam Potential function: / 2, ntb 0, gbsa ipol = dielc = 1.00000, cut 0, igb = 0, iesp = = 999.00000, intdiel 5, nsnb 0 1.00000 TJTTFZZ 0.3793 0.3528 0.0033 25 11. lekce -7- Analýza textových souborů -Rna i-3ri9 -irr n nnnn 51.3204 292.3619 176.5980 -494.7423 -164.7991 0.1822 40.6154 52.5044 62.5486 273.9238 281.5944 294.2701 164.5827 153.4570 155.3607 ■488.9232 ■484.6533 ■483.6872 ■163.0629 ■168.5328 ■169.1747 0.3793 0.3528 0.0033 Potential function ntf 2, ntb 0, Lgb 5, nsnb 25 diele -8-7' ybba 1.00000, cut 999.00000, intdiel = e- 1.00000 )erační systém UNIX a základy programování 11. lekce -8- Ukázka vstup.txt 54.7332 295.7275 128.4090 -508.1302 -155.6037 0.0000 3TT37UT 40.6154 52.5044 62.5486 21J2T3FT9" 273.9238 281.5944 294.2701 script.awk print $2; jeden jednoduchý blok r/b.syyu 164.5827 153.4570 155.3607 ■494.74^3 ■488.9232 ■484.6533 ■483.6872 ■ib4. /yyi 163.0629 ■168.5328 ■169.1747 TJTTH7T 0.3793 0.3528 0.0033 awk —f script.awk vstup.txt nebo awk '{ print $2; }' vstup.txt 295.7275 292.3619 273.9238 281.5944 294.2701 11. lekce -9- Struktura bloku komentáře jsou uvozeny znakem # # tento blok pocita mezisoucet a analyzuje # hodnotu čtvrtého sloupce { # toto je komentár i = i + 1; f = f + $2; # tady pocitam mezisoucet printf("Mezisoucet je %10.3f\n",f); if( $3 == 5 ) { = k + $4; příkazy se uvádějí na samostatné řádky, které je vhodné ukončit středníkem středník je nutné použít, pokud uvádíme dva a více příkazů na jeden řádek )erační systém UNIX a základy programování 11. lekce nesmí obsahovat mezery hodnota proměnné pomocí $ NF počet polí v aktuálně prováděném záznamu (Number of Fields) NR pořadí prováděného záznamu (Number of Records) FS oddělovač polí v záznamu (Field Separator), výchozí je mezera a tabulátor RS oddělovač záznamů (Record Separator), výchozí je znak nové řádky \n $0 celý záznam $1, $2, $3 ... jednotlivé pole záznamu )perační systém UNIX a základy programování 11. lekce Proměnné,... $0 celý záznam $1, $2, $3 ... jednotlivé pole záznamu znak $ umožňuje programový přístup k jednotlivým polím záznamu Příklad: i=3; print $i; \ vytiskne hodnotu třetího pole )erační systém UNIX a základy programování 11. lekce Spouštění AWK skriptů Zpracování textového souboru: „, , vv , výsledek je tištěn na obrazovku Neprime spouštěni: $ awk -f script.awk vstup.txt * analyzovaný textový soubor awk skript interpretrjazyka Analyzovaná data lze zaslat přes standardní vstup: $ awk -f script.awk < vstup.txt $ cat soubor.txt | awk -f script.awk )erační systém UNIX a základy programování 11. lekce Spouštění AWK skriptů,... Prime spouštěni $ ./script.awk vstup.txt $ ./script.awk < vstup.txt $ cat soubor.txt | ./script.awk Skript script. awk musí mít nastaven příznak (executable) a interpreter AWK (součást skriptu). #!/usr/bin/awk -f { i += NF; } END { print "Počet slov je:", i; } )erační systém UNIX a základy programování 11. lekce Cvičení 1. V domovském adresáři si vytvořte adresář awk-data. 2. Do adresáře awk-data zkopírujte soubory matice.txt, produkt.log a rst.out z adresáře /home/kulhanek/Data/AWK. 3. Napište skript, který vytiskne druhý sloupec ze souboru matice.txt. 4. Napište skript, který vytiskne druhý a čtvrtý sloupec ze souboru matice.txt. )erační systém UNIX a základy programování 11. lekce Matematické operace Pokud lze proměnnou interpretovat jako číslo, lze použít následující aritmetické operátory: ++ hodnotu proměnné zvýší o jedničku A++; hodnotu proměnné sníží o jedničku A--; + sečte dvě hodnoty += k proměnné přičte hodnotu A = 5 + 6; A = A + 1; A += 3; A += B; odečte dvě hodnoty A = 5 - 6; A = A - 1; od proměnné odečte hodnotu A -= 3; A -= B; vynásobí dvě hodnoty A = 5 * 6; A = A * 1; proměnnou vynásobí hodnotou A *= 3; A *= B; vydělí dvě hodnoty A = 5 / 6; A = A / ne- proměnnou podělí hodnotou A/= 3; A/= B; )erační systém UNIX a základy programování 11. lekce -16- Příkaz print Příkaz print slouží k neformátovanému vypisování řetězců a čísel. Syntaxe: print hodnotal[,] hodnota2[,] ...; Příklady: i = 5; k = 10.456; j = "hodnota proměnné i ="; print j, i; print "hodnota proměnné k =", k; pokud jsou hodnoty oddělené čárkou, ve výstupu se hodnoty oddělí mezerou )erační systém UNIX a základy programování 11. lekce Cvičení 1. Napište skript, který sečte čísla v druhém sloupci souboru matice.txt. 2. Napište skript, který vytiskne počet řádků, které obsahuje soubor matice.txt. Výsledek ověřte pomocí příkazu wc. 3. Napište skript, který vytiskne počet slov, které obsahuje soubor matice.txt. Výsledek ověřte pomocí příkazu wc. 4. Napište skript, který vypočítá průměrnou hodnotu čísel uvedených v druhém sloupci souboru matice.txt. )erační systém UNIX a základy programování 11. lekce Funkce printf Funkce slouží k vypisování formátovaných textů a čísel printf(" .) ; "Cislo %5d ma hodnotu %03ď do tohoto místa vlož v daném formátu do tohoto místa vlož v daném formátu Rozdíl vůči jazyku BASH: printf příkaz argumenty příkazu se oddělují mezerou lerační systém UNIX a základy programování 11. lekce if( logicky_vyraz } { Pokud je logicky_vyraz pravda, vykoná se prikaz2. V opačném případě se vykoná prikaz3. Rozdíly vůči jazyku BASH if prikazl then else (perační systém UNIX a základy programování 11. lekce Logické operátory Operátory: == rovna se != nerovná se < menší než <= menší než nebo rovno > vetsi nez >= větší než nebo rovno ! negace && logické a logické nebo Příklady: j > 5 (j > 5) && (j < 10) (j <= 5) || (j >= 10) inicializace podmínka zmen Rozdíly vůči jazyku BASH inicializace podmínka zmena perační systém UNIX a základy programování 11 Cvičení 1. Napište skript, který vytiskne největší a nejmenší hodnotu ze třetího sloupce souboru matice.txt. 2. Napište skript, který vytiskne ze souboru rst.out řádky, které obsahují devět slov. 3. Napište skript, který sečte hodnoty všech čísel uvedených v souboru matice.txt. )erační systém UNIX a základy programování 11. lekce -23-