Charakteristika awk

<<vzad obsah vpřed>>

    1 Vyvolání

awk [-F  oddělovač_polí ] [ parametr ...] [ 'program ' [ soubor ...]
awk [-f   soubor_s_programem ] [ soubor ...]

    2 Volby a parametry awk

.
 -F  oddělovač_polí znak nebo regulární výraz, defnující oddělovače polí ( viz dále). Standardně jsou oddělovači polí mezera a tabulátor.
 ' program ' text programu v jazyce awk; alternativně lze číst ze souboru s programem pomocí volby -f.
 parametr inicializuje hodnoty vnitřních proměnných awk při vyvolání ve tvaru proměnná = hodnota .
 -f  soubor_s_programem   definuje zdrojový text programu v jazyce awk jako alternativu k zápisu programu v příkazové řádce.
 soubor specifikuje vstupní soubory. Není-li zadán žádný soubor, pracuje se standardním vstupem. Vstupní soubory se zpracovávají v pořadí, v němž jsou uvedeny. Má-li být jedním ze vstupních souborů standardní vstup, označí se znakem '-'. Vstupní soubory jsou tvořeny záznamy oddělenými oddělovači záznamů (standardně je jím znak nová řádka). Z pohledu jazyka awk se pak záznamy skládají z polí, oddělených standardně mezerami nebo tabulátory. Jednotlivé položky se zleva značí jako $1, $2, ...a celý záznam jako $0.

    3 Formát programu v jazyce awk

vzor { akce }
vzor { akce }
.
.
.

<<vzad obsah vpřed>>

    4 Vzory

Regulární výrazy nebo relační výrazy nebo jejich kombinace spojené logickými operátory:

    4.1 Relační operátory

 ==  rovná se
 !=  nerovná se
  >  větší než
 >=  větší nebo rovno 

    4.2 Operátory shody

  ~  vyhovuje regulárnímu výrazu
 !~  nevyhovuje regulárnímu výrazu

    4.3 Vzory pro začátek a konec zpracování

BEGIN definuje akci, která se vykoná pouze jednou před začátkem zpracování (např. inicializace vnitřních proměnných, tisk hlavičky a pod.)
END definuje akce, které je třeba vykonat po ukončení zpracování vstupních souborů ( např. tisk konce dokumentu, statistiky z celého souboru a jiných celkových výsledků výpočtů v nichž figurují data z více záznamů).

BEGIN i END mohou být několikrát na libovolných místech, vykonávají před začátkem resp. po ukončení zpracování vstupních souiborů v pořadí zápisu těchto vzorů v textu programu.

Př. :

Každá věta souboru zamestnanci.plat obsahuje:

Chceme vytisknout:

pro všechny zaměstnance z tohoto souboru a na konec tiskové sestavy přidat data pro příležitostné pracovníky, nezapsané v souboru zamestnanci.plat. Jejich data zadáme tedy za standardního vstupu ( klávesnice) ve stejném formátu jako má soubor zamestnanci.plat:

awk  '{print $1, $2, $3*(1 + $4/100)}' zamestnanci.plat - | lp

Př.:

Předcházející příklad chceme doplnit o tisk hlavičky na začátku a o tisk oddělovací čáry na konci výstupu:

awk '
BEGIN {print " HRUBÝ PLAT ZAMĚSTNANCŮ"}
END  print {"------------------------------- "}
{print $1, $2, $3*(1 + $4/100)}' zamestnanci.plat - | lp
<<vzad obsah vpřed>>

    4.4 Regulární výrazy v awk

    5 Proměnné awk

    5.1 Vestavěné proměnné

Identifikátor Význam
 $0 celý aktuální záznam.
 $1, $2,... prvé a další pole aktuálního záznamu. Pole, která neexistují ve vstupním záznamu, tedy $(NF+1) a  další obsahují prázdný řetězec. V programu jim lze přiřadit libovolnou hodnotu. Počet položek (NF) může být maximálně 100.
 ARGC počet argumentů příkazu awk , konkrétně počet vstupních souborů.
 ARGV pole argumentů povelové řádky při vyvolání o rozměru ARGC-1.
 ARGV[0] řetězec 'awk', resp. 'nawk', název interpretu jazyka.
 ARGV[1] další názvy vstupních souborů.
 FILENAME název aktuálně zpracovávaného souboru.
 FNR pořadové číslo aktuálního záznamu v aktuálním souboru.
 FS oddělovač položek záznamu, standardně nastaven na mezeru a tabulátor. Podle potřeby lze změnit. přiřazením nebo volbou -F. K definici nového oddělovače lze použít regulární výraz.
 NF počet polí aktuálního záznamu.
  NR číslo aktuálního záznamu.
 RS oddělovač záznamů; standardně nová řádka. Lze změnit přiřazením.
 OFMT výstupní formát pro tisk čísel, standardně %.g - tj. semilogaritmický tvar s šestimístnou mantisou
 OFS oddělovač položek pro výstup, standardně mezera.
 ORS oddělovač záznamů na výstupu, standardně nová řádka.
 RSTART index prvého znaku řetězce, nalezeného funkcí match.
 LSTART délka řetězce, nalezeného funkcí match.
 SUBSEP oddělovač indexů v poli, standardně \34.
<<vzad obsah vpřed>>

    5.2 Uživatelské proměnné

    5.3 Pole v jazyce awk

Př.

Rozdělení řetězece se seznam dní v týdnu, oddělených čárkami do prvků pole:

pocet = split("Po,Út,St,Čt,Pá,So,Ne",dny_v_tydnu,",").

Potom bude tedy v dny_v_tydnu[1] uloženo "Po", v dny_v_tydnu[2] "Út" atd. a proměnná pocet bude mít hodnotu 5.

<<vzad obsah vpřed>>

    6 Aritmetické výrazy

Aritmetika v pohyblivé řádové čárce výrazy téměř shodné s jazykem C ;
Operátory
  +, -, *, /  s obvyklým významem,
  ++   inkrementace o hodnotu 1
  --  dekrementace o hodnotu 1
  %  pro zbytek po celočíselném dělení
 ^ nebo **  mocnění.

Priority operátorů a používání závorek je stejné jako v C.

    7 Aritmetické funkce

atan2(y,x) arkustangens y/x, argument v radiánech
cos(x) cosinus, argument v radiánech
exp(x) exponenciální funkce
int(x) celá část
log(x) přirozený logaritmus
rand() náhodné číslo v intervalu (0,1)
sin(x) sinus, argument v radiánech
sqrt(x) druhá odmocnina
srand(x) nastaví semeno (počáteční hodnotu z níž se generují náhodná čísla) pro funkci rand(). Bez argumentu srand() bere jako semeno aktuální čas.

    8 Řetězcové výrazy

Př.

s1 = "Podvodnice "; s2 = "Chadimová před soudem"; s = s1 s2;

Proměnná s bude mít po této sekvenci příkazů hodnotu "Podvodnice Chadimová před soudem".

Pro manipulaci s řetězci je zabudován rozsáhlý sortiment funkcí.
<<vzad obsah vpřed>>