C2110 Operační systém UNIX a 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 TER5TVO ŠKOLSTVÍ. OP VM«l«v«ni h^i^rť *v™PskV 1VI | t_l i IMI | ^iiti-i ^^^"^^^^ MINISTERSTVO ŠKOLSTVÍ. OP VnhUnrí - **mJr ■ lOnd V C R EVROPSKÁ UNIE u lAdEÍ E a tělovýchovy m kenkjwictichtixitirt 'i n a INVhSl iCb DO ROZVOJh VZDĚLÁVÁNÍ 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 perač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. perační systém UNIX a základy programování 11. lekce Průběh vykonávání skriptu o o 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. perač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 perač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 zvz.jbiy 273.9238 281.5944 294.2701 i/ b.by«u 164.5827 153.4570 155.3607 4 y4.74ZJ 488.9232 ■484.6533 ■483. 6872 -ib4./yyi -163.0629 -168.5328 -169.1747 pole záznamu Potential -rrfcť- 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 perační systém UNIX a základy programování 11. lekce Analýza textových souborů R4 7-3-39 9QR 797R 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 1.00000, cut ©T = 999.00000, intdiel = 1.00000 perační systém UNIX a základy programování 11. lekce Ukázka vstup.txt 54.7332 295.7275 128.4090 -508.1302 -155.6037 0.0000 40.6154 52.5044 62.5486 zvz.jbiy 273.9238 281.5944 294.2701 script.awk print $2; jeden jednoduchý blok 17 b.Ďy«u 164.5827 153.4570 155.3607 488.9232 ■484.6533 ■483. 6872 ib4.vyyi 163.0629 168.5328 169.1747 U.ItíZZ 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 perační systém UNIX a základy programování 11. lekce 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 = k + $4; a_ 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 perační systém UNIX a základy programování 11. lekce Proměnné Přiřazení do proměnné: r nesmí obsahovat mezery A = 10; j B = "toto je text" C = 10.4567; 7 D = A + C; y A= ▼ =5 Hodnota proměnné: echo $A print B; 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 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 perační systém UNIX a základy programování 11. lekce Spouštění AWK skriptů Z pra co vání textové ho souboru: w . vv . výsledek je tištěn na obrazovku Nepnme 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 perač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 (executable) a interpreter AWK (součást skriptu). } perač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. perační systém UNIX a základy programování 11. lekce -15- 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; perač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[,] ...; \ pokud jsou hodnoty oddělené čárkou, ve výstupu se hodnoty oddělí mezerou Příklady: i = 5; k = 10.456; j = "hodnota proměnné i ="; print j, i; print "hodnota proměnné k =", k; perač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. perační systém UNIX a základy programování 11. lekce Funkce printf Funkce printf slouží k vypisování formátovaných textů a čísel. Syntaxe: printf("format", hodnotal, hodnota2, ...); "Cislo %5d ma hodnotu %03d" 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 perač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 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é ano logické nebo Příklady: j > 5 (j > 5) && (j < 10) (j <= 5) M (j >= 10) perač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 W4 for ( (inicializace/podminka;zmena)) ; do prikazl done 4 _ perač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. perační systém UNIX a základy programování 11. lekce -23-