C2110 Operační systém UNIX a základy programování 12. 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í 12. 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í 12. 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í 12. 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í VZOR u 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. 12. 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í 12. 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 I7b.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 U.ItíZZ 0.3793 0.3528 0.0033 pole záznamu Potential -rrfcť- function: ipol diele záznam 2, ntb 0, gbsa 1.00000, cut 0, igb = 0, iesp = = 999.00000, intdiel 5, nsnb 0 1.00000 25 Dperační systém UNIX a základy programování 12. lekce R4 7-3-39 9QR 797R 19« 40Q0 -ROS 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í 12. 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 I7b.Dy«u 164.5827 153.4570 155.3607 4 y4 . 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 Dperační systém UNIX a základy programování 12. 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ů na jeden řádek Dperační systém UNIX a základy programování 12. 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 Rozf 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í 12. 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í 12. lekce -12- 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í 12. 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í 12. lekce Cvičení I • V domovském adresáři si vytvořte adresář awk-data. • Do adresáře awk-data zkopírujte soubory matice.txt, produkt.log a rst.out z adresáře /home/kulhanek/Documents/C2110/Lessonll. • Napište skript, který vytiskne druhý sloupec ze souboru matice.txt. • Napište skript, který vytiskne druhý a čtvrtý sloupec ze souboru matice.txt. Dperační systém UNIX a základy programování 12. 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 A = 5 / 6; A = A / 1; proměnnou podělí hodnotou A/= 3; A/= B; Dperační systém UNIX a základy programování 12. 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í 12. lekce -17- Cvičení II • Napište skript, který sečte čísla v druhém sloupci souboru matice.txt. • Napište skript, který vytiskne počet řádků, které obsahuje soubor matice.txt. Výsledek ověřte pomocí příkazu wc. Dperační systém UNIX a základy programování 12. lekce -18- 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í 12. 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í 12. 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í 12. 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í 12. lekce Cvičení i. Soubor rst.out (wolf.ncbr.munixz:/home/kulhanek/Documents/C2110/Lesson09/rst.out) obsahuje výsledky z molekulové dynamiky. Úkolem je ze souboru vyextrahovat závislost teploty simulovaného systému na čase a tyto data uložit do souboru temp.out, který bude obsahovat právě dva sloupce. První sloupec bude čas a druhý sloupec bude teplota. cas teplota NSTEP = Etot BOND 1-4 NB = EELEC = 500 TIME (PS) 942.6248 51.3204 17.7099 -494 .7423 EKtot ANGLE 1-4 EEL = EGB 0.500 TEMP(K) 151.0990 292.3619 981. 4071 -164.7991 288.02 PRESS EPtot DIHED VDWAALS RESTRAINT 0.0 791.5258 176.5980 -68.3301 0.1822 EAMBER (non-restraint) 791.3436 Pro analýzu souboru rst.out použijte jazyk awk. Řešení srovnejte s implementací v jazyce bash. Dperační systém UNIX a základy programování 12. lekce Cvičení IV • Napište skript, který vytiskne největší a nejmenší hodnotu ze třetího sloupce souboru matice.txt. • Napište skript, který vytiskne ze souboru rst.out řádky, které obsahují devět slov. • Napište skript, který sečte hodnoty všech čísel uvedených v souboru matice.txt. • Napište skript, který vytiskne počet slov, které obsahuje soubor matice.txt. Výsledek ověřte pomocí příkazu wc. • 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í 12. lekce -24-