200 likes | 371 Views
Zpracování textu. Programovatelný filtr awk Jedná se o programovací jazyk (?), který pracuje se záznamy a poli, je pomalejší než vyšší programovací jazyky, dá se přepsat do jazyka C. awk -f scénář.awk vstupní_soubory Struktura programu
E N D
Zpracování textu Programovatelný filtr awk Jedná se o programovací jazyk (?), který pracuje se záznamy a poli, je pomalejší než vyšší programovací jazyky, dá se přepsat do jazyka C. awk -f scénář.awk vstupní_soubory Struktura programu Program pro awk se skládá z dvojic vzor {činnost}. Vzor určuje záznam (obvykle řádek), na kterém se činnost provede. Jestliže není vzor uveden, provádí se činnost na všech záznamech. Implicitní činností je výpis záznamu na standardní výstup. Implicitním oddělovačem polí jsou mezery a tabelátory, impicitním oddělovačem záznamů je nový řádek. Jednotlivá pole jsou přístupná prostřednictvím $1, $2, … Proměnná$0 obsahuje celý záznam.
Zpracování textu $ cat scenar1 {print $2,$1" "$4} $ cat seznam1 Pilny Oto vedouci 41142245 1965 22548 Zaruba Zdenek manager 41142698 1955 15368 Pritulny Ivo referent 41146987 1956 12569 Bezzemek Jan referent 41143658 1956 12548 Kytlink Zdenek referent 41142522 1968 10258 Horn Rene skladnik 41145544 1977 8256 $ cat scenar1 {print $2,$1" "$4} $ awk -f scenar1 seznam1 Oto Pilny 41142245 Zdenek Zaruba 41142698 Ivo Pritulny 41146987 Jan Bezzemek 41143658 Zdenek Kytlink 41142522 Rene Horn 41145544 $ Argumenty příkazu print mohou být odděleny čárkou (mezera) nebo tabelátorem (přehlednější výstup).
Zpracování textu $ cat scenar2 /referent/ {print $2,$1" "$6",- Kc"} $ awk -f scenar2 seznam1 Ivo Pritulny 12569,- Kc Jan Bezzemek 12548,- Kc Zdenek Kytlink 10258,- Kc $ cat scenar3 /referent/ || /manager/ {print $2,$1" "$6",- Kc"} $ awk -f scenar3 seznam1 Zdenek Zaruba 15368,- Kc Ivo Pritulny 12569,- Kc Jan Bezzemek 12548,- Kc Zdenek Kytlink 10258,- Kc $ Vzor je uzavřen mezi znaky / (viz. ed), lze použít libovolný regulární výraz, mohou se používat logické operátory !(negace), ||(logický součet), &&(logický součin), () (úprava priority vyhodnocování). Porovnání se vzorem lze omezit pouze na některá pole pomocí operátoru ~(!~).
Zpracování textu $ cat scenar4 $5~/1956/ {print $0",- Kc"} $ awk -f scenar4 seznam1 Pritulny Ivo referent 41146987 1956 12569,- Kc Bezzemek Jan referent 41143658 1956 12548,- Kc $ cat scenar4 $5!~/1956/ {print $0",- Kc"} $ awk -f scenar4 seznam1 Pilny Oto vedouci 41142245 1965 22548,- Kc Zaruba Zdenek manager 41142698 1955 15368,- Kc Kytlink Zdenek referent 41142522 1968 10258,- Kc Horn Rene skladnik 41145544 1977 8256,- Kc $ $ cat scenar4 {print $1"\t\101\40\102"} $ awk -f scenar4 seznam1 Pilny A B Zaruba A B Pritulny A B Bezzemek A B Kytlink A B Horn A B $ \b backspace \f nová stránka \n nový řádek \r návrat vozíku \t tabelátor \ooo znak s oktalovou \" uvozovky hodnotou
Zpracování textu Proměnné Proměnné awk mohou být skaláry i vektory. Na jednotlivé prvky vektoru se uživatel odvolává pomocí indexu v hranatých závorkách [], indexem může být libovolný řetězec (a[1], pole[3], pole[karel]). awk operuje se dvěma druhy proměnných - vestavěné (vnitřní) a uživatelské (vnější). $0,$1,$2, … FS vstupní oddělovač polí (mezera, TAB) NF počet polí zpracovávaného záznamu NR pořadové číslo zpracovávaného záznamu OFS výstupní oddělovač polí (mezera) ORS výstupní oddělovač záznamů (LF) RS vstupní oddělovač záznamů (LF) Uživatelské proměnné se definují v části příkazu činnost. Jméno proměnné musí začínat písmenem. Proměnné se nedeklarují jako číselné nebo znakové. Chování proměnné se řídí podle kontextu, ve kterém se na ni odvoláváme.
Zpracování textu $ cat scenar4 { print NR, $0 } $ awk -f scenar4 seznam1 1 Pilny Oto vedouci 41142245 1965 22548 2 Zaruba Zdenek manager 41142698 1955 15368 3 Pritulny Ivo referent 41146987 1956 12569 4 Bezzemek Jan referent 41143658 1956 12548 5 Kytak Zdenek referent 41142522 1968 10258 6 Horn Rene skladnik 41145544 1977 8256 $ cat scenar5 { a = $1 b = length($1) print "Jmeno = "a"\tdelka = "b } $ awk -f scenar5 seznam1 Jmeno = Pilny delka = 5 Jmeno = Zaruba delka = 6 Jmeno = Pritulny delka = 8 Jmeno = Bezzemek delka = 8 Jmeno = Kytak delka = 5 Jmeno = Horn delka = 4 $ cat scenar6 { prijem = $6 * 12 delka = length(prijem) print $2,$1"\t"prijem",- Kc/rok\t"delka"-ti ciferny" } $ awk -f scenar6 seznam1 Oto Pilny 270576,- Kc/rok 6-ti ciferny Zdenek Zaruba 184416,- Kc/rok 6-ti ciferny Ivo Pritulny 150828,- Kc/rok 6-ti ciferny Jan Bezzemek 150576,- Kc/rok 6-ti ciferny Zdenek Kytak 123096,- Kc/rok 6-ti ciferny Rene Horn 99072,- Kc/rok 5-ti ciferny
Zpracování textu Kromě vzorů zadávaných pomocí regulárních výrazů mohou být použity ve scénáři awk dva speciální vzory. BEGIN - činnost uvedená u tohoto vzoru se provádí před načtením prvního záznamu. END - činnost uvedená u tohoto vzoru se provádí po zpracování posledního záznamu. Vzor BEGIN musí být uveden jako první vzor, END musí být uveden jako poslední vzor. $ cat seznam Pilny Oto vedouci 156987 56 Zaruba Zdenek manager 156987 21 Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Kytlink Zdenek referent 111287 99 Horn Rene skladnik 226544 22 $
Zpracování textu $ cat scenar7 BEGIN { print "*************************************************" print "*Prijmeni/Jmeno\tProfese\t\tCislo1\tCislo2\t*" print "*************************************************" } { print "*"$0"\t*" } END { print "*************************************************" } $ awk -f scenar7 seznam ************************************************* *Prijmeni/Jmeno Profese Cislo1 Cislo2 * ************************************************* *Pilny Oto vedouci 156987 56 * *Zaruba Zdenek manager 156987 21 * *Pritulny Ivo referent 548766 54 * *Bezzemek Jan referent 211100 1 * *Kytlink Zdenek referent 111287 99 * *Horn Rene skladnik 226544 22 * *************************************************
Zpracování textu Relační operátory a < b, a > b a <= b, a >= b a != b, a == b Aritmetické operace +sčítání - odčítání * násobení / dělení % zbytek po celočíselném dělení ++ inkrementace -- dekrementace Operátory přiřazení a = b a += b a -= b a /= b a %= b
Zpracování textu $ cat scenar8 BEGIN { soucet = 0 pocet = 0 } { soucet += $5 pocet++ } END { print "Prumer polozky Cislo2 je: "soucet/pocet print "Vysledek operace 14 % 6 = "14%6 } $ awk -f scenar8 seznam Prumer polozky Cislo2 je: 42,1667 Vysledek operace 14 % 6 = 2 $
Zpracování textu Podmíněný příkaz má obecný tvar: if ( podmínka ) příkaz1 [else příkaz2] Podmínkou může být libovolný výraz nabývající buď pravdivé (nenulové) nebo nepravdivé (nulové) hodnoty. Příkaz může sestávat z libovolného počtu elementárních příkazů (print, =, if, for, while, break, continue), tyto musí být uzavřeny ve složených závorkách {}.
Zpracování textu $ cat seznam Pilny Oto vedouci 1961 56 Zaruba Zdenek manager 1963 21 Pritulny Ivo referent 1965 54 Bezzemek Jan referent 1967 1 Kytlink Zdenek referent 1968 99 Horn Rene skladnik 1970 22 $ cat scenar9 BEGIN { soucet=0 pocet=0 } { if ( $4 > 1963 ) { soucet += $5 pocet++ } } END { print "Prumer polozky Cislo2 pro Cislo1>1963 je: "soucet/pocet } $ awk -f scenar9 seznam Prumer polozky Cislo2 pro Cislo1>1963 je: 44 $
Zpracování textu $ cat seznam Pilny Oto vedouci 1961 56 Zaruba Zdenek manager 1963 21 Pritulny Ivo referent 1965 54 Bezzemek Jan referent 1967 1 Kytlink Zdenek referent 1968 99 Horn Rene skladnik 1970 22 $ cat scenar10 BEGIN { soucet=0 pocet=0 } { if ( $3 == "referent" ) { soucet += $5 pocet++ } } END { print "Prumer polozky Cislo2 pro Referent je: "soucet/pocet } $ awk -f scenar10 seznam Prumer polozky Cislo2 pro Referent je: 51,3333 $
Zpracování textu Příkaz awk nabízí dva operátory pro vytváření cyklů: while ( podmínka ) příkaz Pro podmínku platí stejná pravidla jako u operátoru if, chování iteračního operátoru je také zcela ve shodě se zaběhnutými pravidly. for ( inicializace ; podmínka ; reinicializace ) příkaz Chování operátoru je naprosto shodné jako u iterační struktury stejného jména pro jazyk C. Příkaz awk připouští použití vnořených cyklů. Lze použít příkazů break a continue pro známou modifikaci iterací.
Zpracování textu $ cat seznam Pilny Oto vedouci 1961 56 Zaruba Zdenek manager 1963 21 Pritulny Ivo referent 1965 54 Bezzemek Jan referent 1967 1 Kytlink Zdenek referent 1968 99 Horn Rene skladnik 1970 22 $ $ cat scenar11 /manager/ { for ( i=1 ; i <= NF ; i++ ) { if ( i == 4 ) continue print "Pole cislo "i"\t"$i } } $ awk -f scenar11 seznam Pole cislo 1 Zaruba Pole cislo 2 Zdenek Pole cislo 3 manager Pole cislo 5 21 $
Zpracování textu Funkce printf Pomocí této funkce je umožněno komplexnější řízení výstupu, je shodná se stejnomennou funkcí jazyka C. Používá se formátovací specifikace a seznamu proměnných, které se mají tisknout. Pokud chybí seznam vstupních souborů, čte awk standardní vstup. Pokud nechceme zpracování žádného textu, zadáme pro ukončení práce znak konec souboru (CTRL-d). %d dekadické číslo %o oktalové číslo %x hexadecimální číslo %f plovoucí čárka %s řetězec znaků %c jeden znak Funkce jsou pro awk definované v rozsahu manuálu, mezi základní patří: length, exp, log, sqrt, ...
Řádkový editor ed Jde o standardní součást každé instalace UNIXu, přes zdánlivou neohrabanost umožňuje veškeré editační operace, vedle interaktivního módu může pracovat i podle předem připraveného scénáře. Je-li argumentem při volání editoru ed jméno existujícího souboru, reaguje ed vypsáním počtu znaků v něm obsažených. Editor pracuje ve dvou režimech, příkazovém a zápisovém. Po spuštění je editor v příkazovém módu. a - přechod do zápisového módu . - přechod do příkazového módu Editovaný text je umístěný v dočasném bufferu v operační paměti a do fyzického souboru se přepíše teprve po příkazu w (vypíše se počet zapsaných znaků). Není-li při spuštění editoru uvedeno jméno již existujícího souboru, ed nemá žádnou odezvu a všechny znaky ukládá do dočasného bufferu. Pokud zadáme jméno existujícího souboru, ed vypíše počet znaků v souboru obsažených. Bez přechodu do zápisového módu ed interpretuje všechny znaky jako příkazy a při nekorektním zadání se hlásí znakem ?. Pro vytváření textu musíme zadat znak a. Ukončení práce - q (CTRL-d).
Řádkový editor ed $ ed ted 111 p ru ed 4p proto asi nebudu 1,5p ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec 1,$p ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $ Zobrazení textu K zobrazení textu slouží příkaz p. Vypíše se aktuální řádek. Pokud chceme zobrazit řádků více, musíme určit jejich adresy. $ cat ted ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $
Řádkový editor ed Pokud se editoru něco nezdá v pořádku (snaha o ukončení bez uložení změn), ozve se znakem ?. Pokud trváme na příkazu q, napodruhé jej akceptuje. Mazání textu Pro mazání řádků slouží příkaz d, který pracuje obdobně jako p. $ ed ted 111 p ru ed d p pouzivat 3d p proto asi nebudu 1,2d p proto asi nebudu w 37 q $ $ cat ted ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $ cat ted proto asi nebudu unix vubec pouzivat $
Řádkový editor ed $ ed ted 37 1p proto asi nebudu unix vubec + pouzivat + ? - unix vubec - proto asi nebudu - ? q $ K prohlížení následujících řádků textu nemusíme použít absolutní adresu řádku. Stačí klávesa Enter nebo příkaz +. Pro obrácený směr používáme příkaz -. Při snaze o zobrazení neexistujícího řádku se ed ozve znakem ?. Obecný formát příkazu: [adresa1,[adresa2]]příkaz[argument]<CR> Nepovinné parametry jsou v hranatých závorkách, příkaz ovlivní řádky dané rozsahen adres, není-li uvedena adresa2, platí příkaz pouze pro řádek adresa1, pokud nejsou adresy uvedeny, provede se příkaz pro aktuální řádek, příkaz je tvořen jedním znakem, argument je ta část textu, která má být modifikována, jméno souboru nebo další adresa řádku.