C2110 Operační systém UNIX a základy programování 11. lekce awk Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kamenice 5, CZ-62500 Brno Operační systém UNIX a základy programování 11. lekce Průběžný test II Dperační systém UNIX a základy programování 11. lekce Průběžný test II > Test prostřednictvím odpovědníku v IS Student - Odpovědníky - C2110 - Test Na, lib (dle seminární skupiny) Délka 20 minut. Je možné sestavit pouze jednu sadu otázek. Používejte průběžné uložení. Vyhodnocení je možné pouze jednou. Je povoleno a doporučeno: • Testovat příkazy v terminálu. • Prohledávat manuálové stránky, svoje zápisky a prezentace předmětu. • Při nejasnostech se přihlaste. Není povoleno • Komunikovat s další osobou mimo vyučujícího. )perač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 AWK http://www.gnu.org/software/gawk/gawk.html 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 Dperační systém UNIX a základy programování 11. lekce 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 25 Dperač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 40.6154 52.5044 62.5486 273.9238 281.5944 294.2701 17 b.by«u 164.5827 153.4570 155.3607 4 y4. /4ZJ 488.9232 ■484.6533 483.6872 -ib4./yyi -163.0629 -168.5328 -169.1747 pole záznamu Potential -rrbť- function záznam ipol diele 2, ntb 0, gbsa 1.00000, cut 0, igb = 0, iesp = = 999.00000, intdiel 5, nsnb 0 1.00000 U.ItíZZ 0.3793 0.3528 0.0033 25 Dperační systém UNIX a základy programování 11. lekce R4 7-3-39 9QR 797R 19« 40Q0 -ROP. 1*309 -1 RR £0*37 D DDDn 51.3204 40.6154 52.5044 62.5486 292.3619 273.9238 281.5944 294.2701 176.5980 164.5827 153.4570 155.3607 -494.7423 488.9232 ■484.6533 483.6872 -164.7991 163.0629 168.5328 169.1747 0.1822 0.3793 0.3528 0.0033 Potential function ntf 2, ntb 0, Lgb 5, nsnb 25 diele 1.00000, cut 999.00000, intdiel 1.00000 Dperač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. Dperační systém UNIX a základy programování 11. lekce 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. 11. lekce Ukázka vstup.txt 54.7332 295.7275 128.4090 -508.1302 -155.6037 0.0000 40.6154 52.5044 62.5486 273.9238 281.5944 294.2701 script.awk print $2; jeden jednoduchý blok 17 b.syau 164.5827 153.4570 155.3607 4 y4 . /4Z3 488.9232 ■484.6533 483.6872 ib4.vyyi 163.0629 168.5328 169.1747 u.±vzz 0.3793 0.3528 0.0033 awk —f script.awk vstup.txt nebo awk f{ print $2; }f vstup.txt 295.7275 292.3619 273.9238 281.5944 294.2701 Dperační systém UNIX a základy programování 11. lekce Struktura bloku komentáře jsou uvozeny znakem # # tento blok pocita mezisoučet druhého sloupce # a mezisoucet čtvrtého sloupce, pokud je ve tretim # sloupci hodnota 5 { # toto je komentár i = i + 1; f = f + $2; # tady pocitam mezisoucet printf("Mezisoucet je %10.3f\n",f); if( $3 == 5 ) { k = k + $4; # mezisoucet pro ctvrty sloupec } 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ů najeden řádek Dperační systém UNIX a základy programování 11. lekce Proměnné Přiřazení do proměnné: A = 10; B = "toto je text" C = 10.4567; D = A + C; Hodnota proměnné: print A + C; print B; nesmí obsahovat mezery I Rotí i T A= =5 echo $A \ i hodnota proměnné pomocí $ Speciální proměnné: 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 Dperač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 Dperační systém UNIX a základy programování 11. lekce -14- Spouštění AWK skriptů Z pra co vá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 interpretr jazyka Analyzovaná data lze zaslat přes standardní vstup: $ awk -f script.awk < vstup.txt $ cat soubor.txt | awk -f script.awk Operační systém UNIX a základy programování 11. lekce Spouštění AWK skriptů,... Přímé spouštění $ ./script.awk vstup.txt $ ./script.awk < vstup.txt $ cat soubor.txt | ./script.awk #!/usr/bin/awk -f / { i += NF; } END { print "Počet slov je:", i; Skript script. awk musí mít nastaven příznak x (executable) a interpreter AWK (součást skriptu). } Dperač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/Documents/C2110/Lessonll. 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. Dperační systém UNIX a základy programování 11. lekce -17- 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 / proměnnou podělí hodnotou A/= 3; A/= B; A = 5 / 6; A = A / 1; Dperační systém UNIX a základy programování 11. lekce 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 Dperační systém UNIX a základy programování 11. lekce -19- 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. Dperační systém UNIX a základy programování 11. lekce -20- Funkce printf Funkce printf slouží k vypisování formátovaných textů a čísel. Syntaxe: printf("format", hodnotal, hodnota2, ...); "Cislo %5d ma hodnotu %03ď do tohoto místa vlož hodnotu2 v daném formátu do tohoto místa vlož hodnotul v daném formátu Rozdíl vůči jazyku BASH: printf [format] [hodnotal] [hodnota2] ... příkaz argumenty příkazu se oddělují mezerou Dperační systém UNIX a základy programování 11. lekce Podmínky if( logicky_vyraz ) { prikaz2; • • • } else { prikaz3; } Pokud je logicky_vyraz pravda, vykoná se prikaz2. V opačném případě se vykoná prikaz3. Příklad: if ( $1 > max ) { max = $1; } Rozdíly vůči jazyku BASH \—L if prikazl; then prikaz2 else prikaz3 fi Dperační systém UNIX a základy programování 11. lekce Logické operátory Operátory: < <= > >= i m && rovna se nerovná se menší než menší než nebo rovno vetsi nez větší než nebo rovno negace logické ano logické nebo Příklady: j > 5 (j > 5) (j <= 5) && (j < 10) II (j >= 10) Dperační systém UNIX a základy programování 11. lekce Cykly for(inicializace; podminka; zmena) { prikazl; } Příklad: for(I=l;I <= 10;I++){ sum = sum + $I; } Rozdíly vůči jazyku BASH U4 for ( (inicializace/podminka;zmena)) ; do prikazl done «_ Dperační systém UNIX a základy programování 11. lekce 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. Dperační systém UNIX a základy programování 11. lekce -25-