Obcování s ďáblem 27: Awk a výrazy - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Software

Obcování s ďáblem 27: Awk a výrazy

7. února 2002, 00.00 | Jak jsme si slíbili minule, nejprve se velmi stručně seznámíme s několika standardními proměnnými awk, a pak už se pustíme do výrazů.

Standardní proměnné

Při interpretaci skriptů awk dokáže rozeznat některé standardní proměnné, a nahradit je odpovídajícími hodnotami; v některých případech nám to může uspořit spoustu práce. Tak třeba už minule jsme se seznámili se standardní proměnnou NR, jež obsahuje číslo právě zpracovávané řádky. Samozřejmě bychom totéž mohli zajistit sami, např. takto:

{ line++; pole[line]=... }

ale NR je daleko pohodlnější, a nemůže dojít k problémům u složitějších skriptů: kdybychom třeba v minulém příkladu při nějakých úpravách zapomněli na původní účel a před složené závorky umístili nějaký omezující regulární výraz

/.gz/ { line++; ... }

skript by zřejmě přestal správně fungovat; s použitím standardního NR však takový problém nehrozí.

Mezi standardní proměnné patří

  • FS ("Field Separator"): regulární výraz (!), který od sebe odděluje jednotlivá pole na řádku. Standardně je to mezera; obsah proměnné však můžeme podle potřeby změnit;
  • RS ("Record Separator"): textový řetězec, který od sebe odděluje jednotlivé řádky. Standardně je zde samozřejmě znak LF ("\n"), ale i ten můžeme změnit;
  • NF ("Number of Fields"): počet polí na řádku. Chceme-li např. vypsat vždy předposlední pole, můžeme použít příkaz print $(NF-1);
  • NR ("Number of Records"): pořadové číslo řádku již známe.

Příkaz awk podporuje ještě další standardní proměnné, avšak ty se v praxi využívají méně často; kompletní seznam proměnných a jejich popis samozřejmě naleznete v man awk.

Výrazy

Výrazy můžeme sestavovat z proměnných (mezi něž počítáme i výrazy $N) a konstant pomocí standardních operátorů:

+ - * / % ^

Základní aritmetické operátory fungují víceméně standardním způsobem; programátoři v C si jen musí dát pozor na to, že awk nerozlišuje typy int a float, a proto dělení vždy počítá v reálných číslech; chceme-li získat celočíselný podíl, musíme použít standardní funkci int (funkce popíšeme příště). Operátor '^' representuje umocňování.

Naopak pro ty, kdo C neznají, připomínáme, že operátor '%' zjistí zbytek po celočíselném dělení.

+= -= *= /= %= ^= =

Kombinované operátory <op>= fungují přesně stejně jako v C: zápis "a<op>=b" přesně odpovídá zápisu "a=(a)<op>(b)", až na to, že "a" se vyhodnotí jen jednou (to má význam hlavně v případě, že vyhodnocení "a" má nějaké sideefekty).

Můžeme tedy standardně číst např. "x+=5" jako "přičti pětku k x".

Všechny operátory dosazení (včetně samotného '=') také stejně jako v C mají hodnotu ("to, co se dosadilo"), takže je můžeme spojovat dohromady a používat ve výrazech: tak třeba výraz "a=b+=c=3" můžeme rozdělit na "a=(b+=(c=3))", a číst jej takto:

  1. do proměnné "c" dosaď trojku...
  2. ...tuto hodnotu (3) přičti k proměnné "b"...
  3. výslednou hodnotu "b" dosaď do proměnné "a".

++ --

I operátory přičtení, respektive odečtení jedničky fungují stejně jako v C. Platí zde i to, že mohou být použity před nebo za proměnnou, a v prvém případě je hodnota výrazu hodnotou po provedení operace, kdežto ve druhém hodnotou před provedením operace:

157 /tmp> awk 'BEGIN { print i,j; print ++i,j++; print i,j }'
0 0
1 0
1 1
158 /tmp> 

Speciálním operátorem awk, který jazyk C neznal, je mezera: ta spojí hodnoty po obou stranách jako řetězce:

163 /tmp> awk 'BEGIN { a="Ah"; b="oj"; c=a b ", Field separator je \"" FS "\""; print c }'
Ahoj, Field separator je " "
164 /tmp> 

Můžeme využívat také relační operátory, jež vrací hodnotu 0 pro "není pravda" a 1 pro "je pravda", a můžeme je kombinovat pomocí operátorů pro logickou negaci, konjunkci a disjunkci:

> < >= <= == != ! && ||

Povšimněte si, že stejně jako v C pro zjištění rovnosti slouží dvojice znaků '='. To je past, do které často upadnou uživatelé jazyků jako BASIC nebo Pascal: použijeme-li omylem jen jediné rovnítko, bude se interpretovat jako dosazení, a můžeme se divit "nesmyslným" výsledkům!

Opět pro ty kdo neznají C, unární operátor '!' representuje negaci (podobně v kombinaci s rovnítkem slouží pro relaci "nerovná se"), a operátory '&&' a '||' representují konjuknci ("a zároveň"), respektive disjunkci ("nebo").

~ !~

Dvojice nových relačních operátorů srovná řetězec s regulárním výrazem, a vrátí hodnotu 1 ("ano") v případě, že řetězec regulárnímu výrazu odpovídá ('~') nebo neodpovídá ('!~'):

166 /tmp> ls -l | awk '{ print $9,$9~".gz" }'
...
IVarDealloc.sit 0
Kapitola4.tar.gz 1
Letterbox169.tiff 0
...
167 /tmp> 

Uvnitř výrazů samozřejmě můžeme podle potřeby používat závorky.

Příště se podíváme na funkce

V příštím dílu našeho seriálu dokončíme popis výrazů awk popisem nejdůležitějších z jeho standardních funkcí.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: