C2110 Operační systém UNIX základy programování 10. lekce / modul 2 PS/2020 Distanční forma výuky: Rev4 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 Dperační systém UNIX a základy programování 10. lekce / modul 2 Obsah > AWK * K čemu slouží jazyk AWK? * Struktura skriptu, průběh vykonávání * Struktura bloku, regulérní výrazy, spuštění skriptů * Proměnné, operace nad proměnnými * Formátovaný a neformátovaný výstup Dperační systém UNIX a základy programování 10. lekce / modul 2 -2- 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í 10. lekce / modul 2 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í 10. lekce / modul 2 Průběh vykonávání skriptu awk -f skript.awk souborl.txt soubor2.txt uživatelský skript skript.awk proměnné jsou globální (pokud není určeno jinak) Dperační systém UNIX a základy programování 10. lekce / modul 2 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í 10. lekce / modul 2 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 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 u.10^^ 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í 10. lekce / modul 2 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 ©T = 999.00000, intdiel = 1.00000 Dperační systém UNIX a základy programování 10. lekce / modul 2 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í 10. lekce / modul 2 Struktura bloku, příklad # blok pocita mezisoucet druhého sloupce # a mezisoucet čtvrtého sloupce, pokud je ve tretim # sloupci hodnota 5 { # toto je komentár f = f + $2; # tady pocitam mezisoucet printf("Mezisoucet je %10.3f\n",f); if( $3 == 5 ) { k = k + $4; # mezisoucet pro ctvrty sloupec } } # blok pocita kumulativní sumu teploty (paty sloupec) # na radcich obsahujicich klicove slovo "TEMP" /TEMP/ { temp = temp + $5; } komentáře jsou uvozeny znakem # 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 Operační systém UNIX a základy programování 10. lekce / modul 2 VZOR - Regulární výrazy /VZOR/ { Pokud záznamu vyhovuje VZOR, tak se blok vykoná. } Vzor je regulární výraz. Regulární výraz je jazyk, který popisuje strukturu textového řetězce. Jazyk se využívá k vyhledávání textových řetězců, k nahrazování části řetězců. Příklady jednoduchých regulárních výrazů: TEXT - je splněno, pokud je v daném záznamu obsažen TEXT (může být kdekoliv) ATEXT - je splněno, pokud je v daném záznamu obsažen TEXT na začátku TEXT$ - je splněno, pokud je v daném záznamu obsažen TEXT na konci Operační systém UNIX a základy programování 10. lekce / modul 2 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í 10. lekce / modul 2 Cvičení 1 1. Vytvořte adresář awk-data. 2. Do adresáře awk-data zkopírujte soubory matice.txt, produkt.log a rst.out z adresáře /horrie/kulhanek/Docurrients/C2110/LessonlO. 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í 10. lekce / modul 2 -13- 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 Ro ly vůči jazyku BASH A=5 echo $A 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í 10. lekce / modul 2 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 pole určeného hodnotou proměnné / Dperační systém UNIX a základy programování 10. lekce / modul 2 -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í 10. lekce / modul 2 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í 10. lekce / modul 2 -17- 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í 10. lekce / modul 2 Cvičení 2 • 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í 10. lekce / modul 2 -19- Samostudium Dperační systém UNIX a základy programování 10. lekce / modul 2 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 x (executable) a interpreter AWK (součást skriptu). #!/usr/bin/awk -f { i += NF; } END { print "Počet slov je:", i; } Tento způsob spouštění nedoporučuji používat. Dperační systém UNIX a základy programování 10. lekce / modul 2