20
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

  • Upload
    leanna

  • View
    44

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Zpracování textu

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.

Page 2: Zpracování textu

Zpracování textu

$ cat scenar1{print $2,$1" "$4}$ cat seznam1Pilny Oto vedouci 41142245 1965 22548Zaruba Zdenek manager 41142698 1955 15368Pritulny Ivo referent 41146987 1956 12569Bezzemek Jan referent 41143658 1956 12548Kytlink Zdenek referent 41142522 1968 10258Horn Rene skladnik 41145544 1977 8256$ cat scenar1{print $2,$1" "$4}$ awk -f scenar1 seznam1Oto Pilny 41142245Zdenek Zaruba 41142698Ivo Pritulny 41146987Jan Bezzemek 41143658Zdenek Kytlink 41142522Rene Horn 41145544$

Argumenty příkazu print mohou být odděleny čárkou (mezera) nebo tabelátorem (přehlednější výstup).

Page 3: Zpracování textu

Zpracování textu

$ cat scenar2/referent/ {print $2,$1" "$6",- Kc"}$ awk -f scenar2 seznam1Ivo Pritulny 12569,- KcJan Bezzemek 12548,- KcZdenek Kytlink 10258,- Kc$ cat scenar3/referent/ || /manager/ {print $2,$1" "$6",- Kc"}$ awk -f scenar3 seznam1Zdenek Zaruba 15368,- KcIvo Pritulny 12569,- KcJan Bezzemek 12548,- KcZdenek 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 ~ (!~).

Page 4: Zpracování textu

Zpracování textu

$ cat scenar4$5~/1956/ {print $0",- Kc"}$ awk -f scenar4 seznam1Pritulny Ivo referent 41146987 1956 12569,- KcBezzemek Jan referent 41143658 1956 12548,- Kc$ cat scenar4$5!~/1956/ {print $0",- Kc"}$ awk -f scenar4 seznam1Pilny Oto vedouci 41142245 1965 22548,- KcZaruba Zdenek manager 41142698 1955 15368,- KcKytlink Zdenek referent 41142522 1968 10258,- KcHorn Rene skladnik 41145544 1977 8256,- Kc$

\b backspace \f nová stránka\n nový řádek \r návrat vozíku\t tabelátor \ooo znak s oktalovou\" uvozovky hodnotou

$ cat scenar4{print $1"\t\101\40\102"}$ awk -f scenar4 seznam1Pilny A BZaruba A BPritulny A BBezzemek A BKytlink A BHorn A B$

Page 5: Zpracování textu

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áznamuNR pořadové číslo zpracovávaného záznamuOFS 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.

Page 6: Zpracování textu

$ cat scenar4{ print NR, $0 }$ awk -f scenar4 seznam11 Pilny Oto vedouci 41142245 1965 225482 Zaruba Zdenek manager 41142698 1955 153683 Pritulny Ivo referent 41146987 1956 125694 Bezzemek Jan referent 41143658 1956 125485 Kytak Zdenek referent 41142522 1968 102586 Horn Rene skladnik 41145544 1977 8256

Zpracování textu

$ cat scenar5{ a = $1b = length($1)print "Jmeno = "a"\tdelka = "b }$ awk -f scenar5 seznam1Jmeno = Pilny delka = 5Jmeno = Zaruba delka = 6Jmeno = Pritulny delka = 8Jmeno = Bezzemek delka = 8Jmeno = Kytak delka = 5Jmeno = Horn delka = 4

$ cat scenar6{ prijem = $6 * 12delka = length(prijem)print $2,$1"\t"prijem",- Kc/rok\t"delka"-ti ciferny" }$ awk -f scenar6 seznam1Oto Pilny 270576,- Kc/rok 6-ti cifernyZdenek Zaruba 184416,- Kc/rok 6-ti cifernyIvo Pritulny 150828,- Kc/rok 6-ti cifernyJan Bezzemek 150576,- Kc/rok 6-ti cifernyZdenek Kytak 123096,- Kc/rok 6-ti cifernyRene Horn 99072,- Kc/rok 5-ti ciferny

Page 7: Zpracování textu

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 seznamPilny Oto vedouci 156987 56Zaruba Zdenek manager 156987 21Pritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Kytlink Zdenek referent 111287 99Horn Rene skladnik 226544 22$

Page 8: Zpracování textu

Zpracování textu

$ cat scenar7BEGIN {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 **************************************************

Page 9: Zpracování textu

Zpracování textu

Aritmetické operace

+ sčítání- odčítání* násobení/ dělení% zbytek po celočíselném dělení++ inkrementace-- dekrementace

Relační operátory

a < b, a > ba <= b, a >= ba != b, a == b

Operátory přiřazení

a = ba += ba -= ba /= ba %= b

Page 10: Zpracování textu

Zpracování textu

$ cat scenar8BEGIN {soucet = 0pocet = 0 }{soucet += $5pocet++ }END {print "Prumer polozky Cislo2 je: "soucet/pocetprint "Vysledek operace 14 % 6 = "14%6}$ awk -f scenar8 seznamPrumer polozky Cislo2 je: 42,1667Vysledek operace 14 % 6 = 2$

Page 11: Zpracování textu

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 {}.

Page 12: Zpracování textu

$ cat seznamPilny Oto vedouci 1961 56Zaruba Zdenek manager 1963 21Pritulny Ivo referent 1965 54Bezzemek Jan referent 1967 1Kytlink Zdenek referent 1968 99Horn Rene skladnik 1970 22$ cat scenar9BEGIN { soucet=0 pocet=0 }{if ( $4 > 1963 ) {soucet += $5pocet++ }}END {print "Prumer polozky Cislo2 pro Cislo1>1963 je: "soucet/pocet}

Zpracování textu

$ awk -f scenar9 seznamPrumer polozky Cislo2 pro Cislo1>1963 je: 44$

Page 13: Zpracování textu

$ cat seznamPilny Oto vedouci 1961 56Zaruba Zdenek manager 1963 21Pritulny Ivo referent 1965 54Bezzemek Jan referent 1967 1Kytlink Zdenek referent 1968 99Horn Rene skladnik 1970 22$ cat scenar10BEGIN { soucet=0 pocet=0 }{if ( $3 == "referent" ) {soucet += $5pocet++ }}END {print "Prumer polozky Cislo2 pro Referent je: "soucet/pocet}

Zpracování textu

$ awk -f scenar10 seznamPrumer polozky Cislo2 pro Referent je: 51,3333$

Page 14: Zpracování textu

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í.

Page 15: Zpracování textu

Zpracování textu

$ cat seznamPilny Oto vedouci 1961 56Zaruba Zdenek manager 1963 21Pritulny Ivo referent 1965 54Bezzemek Jan referent 1967 1Kytlink Zdenek referent 1968 99Horn 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 seznamPole cislo 1 ZarubaPole cislo 2 ZdenekPole cislo 3 managerPole cislo 5 21$

Page 16: Zpracování textu

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.

%d dekadické číslo%o oktalové číslo%x hexadecimální číslo%f plovoucí čárka%s řetězec znaků%c jeden znak

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).

Funkce jsou pro awk definované v rozsahu manuálu, mezi základní patří: length, exp, log, sqrt, ...

Page 17: Zpracování textu

Řádkový editor edJde 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).

Page 18: Zpracování textu

Řádkový editor 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.

$ ed ted111pru ed4pproto asi nebudu1,5pahoj ted pisi w textovemeditoru ed a mams nim neskonale problemyproto asi nebuduunix vubec1,$pahoj ted pisi w textovemeditoru ed a mams nim neskonale problemyproto asi nebuduunix vubecpouzivatru ed$

$ cat tedahoj ted pisi w textovemeditoru ed a mams nim neskonale problemyproto asi nebuduunix vubecpouzivatru ed$

Page 19: Zpracování textu

Řádkový editor edPokud 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 ted111pru eddppouzivat3dpproto asi nebudu1,2dpproto asi nebuduw37q$

$ cat tedahoj ted pisi w textovemeditoru ed a mams nim neskonale problemyproto asi nebuduunix vubecpouzivatru ed

$ cat tedproto asi nebuduunix vubecpouzivat$

Page 20: Zpracování textu

Řádkový editor ed

$ ed ted371pproto 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.