Nejjednodušší program, který opíše standardní vstup na standardní výstup, je následující:
... | awk '{ print }' | ...Vzorek jsme vynechali, a proto se akce print provede pro všechny vstupující řádky. Akce print bez parametrů opíše celý řádek na výstup. Užitečnější bude vybrat si určité položky a tyto vypsat, např. první dvě položky v opačném pořadí:
{ print $2, $1 }Takový zápis akce na příkazovém řádku spouštějícím awk musí být nutně uzavřen do dvojice apostrofů, aby nedošlo k expanzi dvojic znaků $1 a $2 na poziční parametry shellu, ale aby se v nezměněné podobě předaly awk.
Položky oddělené v zápisu akce print čárkou se na výstupu oddělí aktuálně nastavenou hodnotou oddělovače položek. Položky oddělené pouze mezerou se spojí bez oddělovače. Vyzkoušejme si:
{ print $2 $1 }
Akce print umí vypisovat i obsahy proměnných a textové řetězce, např.:
{ print "Číslo záznamu=" NR,Takto zadaný program před kompletním záznamem vypíše číslo záznamu a počet položek v aktuálním záznamu.
"Počet položek=" NF, $0 }
Výstup můžeme rozdělit i do více výstupních souborů. Např. program:
{ print $1 >"soubor1";zapíše první položku do souboru soubor1 a druhou položku do souboru soubor2. Lze použít i zápis >>. Potom se do souboru přidává za konec. Jméno souboru může být proměnná, obsah zapisovaný do souboru může být konstanta. Můžeme tedy napsat např.:
print $2 >"soubor2" }
{ print "nesmysl" >>$2 }Jako jméno souboru se použije obsah druhé položky (pozor, nesmí být prázdná). V tomto příkladě bude počet řádků v jednotlivých souborech znamenat četnost slov ve druhém poli.
Podobně lze výstup z akce print předat rourou procesu. Např. poslat poštou na adresu 'zaznamenej':
{ print | "mail zaznamenej" }Pokud si tento příklad vyzkoušíme, zjistíme, že se procesu předá celý vstup naráz, tj. nepředává se po jednotlivých záznamech a navíc se předá až po načtení konce vstupu.
Pomocí proměnných OFS a ORS můžeme samostatně nastavit oddělovače pouze pro výstup. Obsahem OFS se oddělí vypisované položky a obsahem ORS se oddělí vypisované záznamy.
Jazyk awk také poskytuje možnost formátovaných výstupů pomocí akce printf. Tato akce se zapisuje následujícím způsobem:
printf formát, výraz, výraz, ...Popisovačem formát sdělíme strukturu výstupu a prostřednictvím nadefinované struktury vypíšeme jednotlivé výrazy. V popisovači formát se používá stejná syntaxe jako v jazyce C. Uveďme si ve stručnosti možnosti:
Do řetězce formát vkládáme text, který se má vypsat. Na místa, kde se má vypsat výsledek výrazu, vložíme popisovač ve tvaru:
%příznakyšířkapřesnosttypkonverzePrvnímu popisovači (každý popisovač začíná vždy znakem %) se přiřadí výsledek prvního výrazu, druhému popisovači výsledek druhého výrazu atd. Jednotlivá pole popisovače mají tento význam (všechna pole vyjma konverze jsou nepovinná):
Na místě konverze se smějí použít tyto symboly:
Akce printf negeneruje žádné výstupní oddělovače. Všechny se musejí specifikovat ve formátu. Uveďme si příklad použití:
{ printf "Průměr=%8.2f, počet pokusů=%10ld\n", $1, $2 }První položka se vytiskne jako číslo v pohyblivé řádové čárce celkem na 8 znaků se dvěma číslicemi za desetinnou tečkou. Druhá položka se vytiskne jako long integer na 10 znaků. Znak \n představuje nový řádek.
Programovací jazyk textových manipulací: awk
Záznamy a položky
BEGIN a END