Obcování s ďáblem: Awk a funkce - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

Obcování s ďáblem: Awk a funkce

14. února 2002, 00.00 | Dnes se seznámíme s nejdůležitějšími ze standardních funkcí, jež awk nabízí.

Dnes se seznámíme s nejdůležitějšími ze standardních funkcí, jež awk nabízí.

Aritmetika a podobně

Pro práci s čísly jsou k dispozici (mj.) tyto služby:

  • exp(x): zjistí hodnotu e^x;
  • log(x): zjistí přirozený logaritmus čísla x;
  • sqrt(x): nalezne druhou odmocninu čísla x;
  • sin(x): zjistí sinus x;
  • cos(x): nalezne cosinus x;
  • atan2(y,x): zjistí hodnotu arkustangentu y/x (tato podoba je nejvhodnější pro převody kartézských souřadnic na polární, proto je preferována před prostým arkustangentem);
  • int(x): vrátí celočíselnou část čísla x;
  • rand: vrátí náhodnou hodnotu mezi nulou a jedničkou.

Funkce pro práci s textem

Služby awk pro práci s textovými řetězci se využívají v praxi mnohem častěji, než aritmetické funkce — konečně, awk většinou slouží právě na zpracování textu. Proto se na ně podíváme trochu podrobněji, a ukážeme si i několik příkladů.

Vyhledávání částečných řetězců

Pro jednoduchou práci s částečnými řetězci slouží funkce index a substr. První z nich vyhledá pozici zadaného řetězce; druhá naopak vrátí částečný řetězec, určený pozicí a délkou. Pozor; na rozdíl od obdobných služeb knihoven jazyka C jsou zde indexy počítány od jedné, ne od nuly:

  • index(text,řetězec): vyhledá řetězec v textu a vrátí pozici jeho začátku. Jestliže v textu není řetězec obsažen, vrátí nulu;
  • substr(text,pozice,délka): vrátí částečný řetězec, který leží v textu na pozici a má délka znaků.

Typické využití by mohlo vypadat třeba nějak takto:

192 /tmp> ls -l
total 3008
-rw-r--r--   1 ocs   wheel  116880 Jan 23 17:57 BadAspectRatio.tiff
drwxr-xr-x   2 ocs   wheel      24 Jan 19 03:15 Format.rtfd/
drwxr-xr-x  15 ocs   wheel     466 Jan 23 22:59 IVarDealloc/
-rw-r--r--   1 100   staff  427227 Jan 23 22:17 IVarDealloc.sit
...
193 /tmp> ls -l | awk '{ print $9,"prava vlastnika:",substr($1,2,3) }'
BadAspectRatio.tiff prava vlastnika: rw-
Format.rtfd/ prava vlastnika: rwx
IVarDealloc/ prava vlastnika: rwx
IVarDealloc.sit prava vlastnika: rw-
...
194 /tmp> 

Mezi funkce pro práci s částečnými řetězci můžeme zařadit i funkci length, která zjistí délku zadaného řetězce:

  • length[(řetězec)]: argument je nepovinný; pokud jej vynecháme, vrátí funkce délku celého zpracovávaného řádku (takže length je totéž, jako length($0)).

Regulární výrazy

Ve složitějších případech ovšem jednoduché služby pro práci s částečnými řetězci podle indexů nestačí. V awk ovšem máme k dispozici služby, jež využívají regulárních výrazů:

  • match(text,regexp): vrátí index prvního výskytu částečného řetězce, odpovídajícího regulárnímu výrazu regexp uvnitř textu. Jestliže žádná část textu regulárnímu výrazu neodpovídá, vrátí nulu. Pro větší pohodlí programátora jako sideefekt uloží vrácenou hodnotu (index) do proměnné RSTART a délku částečného řetězce do proměnné RLENGTH;
  • sub(regexp,řetězec[,text]): vyhledá první výskyt částečného řetězce, odpovídajícího regulárnímu výrazu regexp uvnitř textu, a nahradí jej řetězcem. Argument text můžeme vynechat; pak se na jeho místě automaticky použije právě zpracovávaný řádek (tedy $0). Existuje varianta této funkce gsub, jež pracuje obdobně, ale namísto prvého výskytu nahradí všechny výskyty regulárního výrazu;
  • split(text,pole[,regexp]): rozdělí text na části, oddělené výskyty regulárního výrazu regexp. Ty uloží do pole pole (počínaje indexem 1), a vrátí jejich počet. Argument regexp můžeme vynechat; pak se na jeho místě automaticky použije obsah standardní proměnné FS.

Dejme tomu, že bychom chtěli ve jménech souborů vyhledávat části, jež začínají písmenem 'a' a končí písmenem 't':

199 /tmp> ls -l | awk '{ match($9,"a.*t"); print $9,substr($9,RSTART,RLENGTH) }'
BadAspectRatio.tiff adAspectRatio.t
Format.rtfd/ at.rt
IVarDealloc/ 
IVarDealloc.sit arDealloc.sit
...
200 /tmp> 

Převody

Potřebujeme-li vzájemně převádět malá a velká písmena, můžeme použít funkce tolower a toupper:

  • tolower(text): vrátí tentýž text, avšak převede všechna velká písmena na malá;
  • toupper(text): vrátí tentýž text, avšak převede všechna malá písmena na velká.

Speciální funkce

Ačkoli awk podporuje více speciálních funkcí, my se seznámíme jen s jednou z nich:

  • cmd(příkaz): provede zadaný příkaz v shellu.

Následujícím způsobem např. můžeme uložit do archivu všechny obrázky, jejichž velikost nepřesahuje 100 000 bytů (používáme dosud nepopsaný příkaz if, ovšem jeho význam je zřejmý):

241 /tmp> ls -l *.tiff
-rw-r--r--  1 ocs  wheel  116880 Jan 23 17:57 BadAspectRatio.tiff
-rw-r--r--  1 ocs  wheel   50114 Jan 23 18:26 Letterbox169.tiff
-rw-r--r--  1 ocs  wheel   29518 Jan 23 17:19 PixelWidth.tiff
242 /tmp> ls -l *.tiff | awk '{ if ($5<100000) f=f " " $9 } END { system("tar czf SmallTiffs.tar.Z" f) }' 
243 /tmp> tar tzf SmallTiffs.tar.Z 
Letterbox169.tiff
PixelWidth.tiff
244 /tmp> 

Příště...

...se jen na malou chvilku vrátíme k výběru řádků, a pak se konečně pustíme do příkazů. Popíšeme si tedy mj. i příkaz if, který jsme zatím použíli jen intuitivně.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: