9. cvičení - Programovací jazyk AWK
Základní použití
awk 'program' soubory
awk -f skript soubory
Struktura programu
AWK čte soubor po řádcích a hledá vzorek. Pokud jej na řádku najde pak vykoná akci. Jakmile projde všechny vzorky tak program pokračuje na další řádek a znovu prochází všechny vzorky. Vzorek i akce lze vynechat ale ne současně. Pokud není vzorku určena akce tak se vyhovujíví řádek zkopíruje na výstup. Pokud vynecháme vzorek zak se akce provede na každý řádek. Akci musíme uzavřít do '{}'.
vzorek { akce }
vzorek { akce }
...
Výstup
// Vypíše všechny řádky souboru
awk '{ print }' text.txt
// Vypíše první dvě položky v opačném pořadí
awk '{ print $2, $1 }' text.txt
// Výpis obsahu proměnných
awk '{ print "Číslo záznamu=" NR, "Počet položek=" NF, $0 }' text.txt
// Rozdělení výstupu do více souborů
awk '{ print $1 >"soubor1"; print $2 >"soubor2" }' text.txt
// Formárovaný výstup
awk '{ printf "Průměr=%8.2f, počet pokusů=%10ld\n", $1, $2 }' text.txt
BEGIN a END
BEGIN a END jsou speciální případy vzorků. BEGIN musí být jako první vzorek a provede se před přečtením prvního záznamu. END musí být jako poslední vzorek a povede se až po zpracování celého souboru.
Proměnné, výrazy a přiřazení
Jazyk awk proměnné zpracovává podle kontextu: buď jako numerické hodnoty (v pohyblivé řádové čárce), nebo jako řetězce znaků. Řetězce se na numerické hodnoty převádějí podle potřeby.
Příkazy pro řízení toku
Jazyk awk dovoluje použít příkazy pro řízení toku obvyklé u vyšších programovacích jazyků. Jde o tyto příkazové konstrukce:
if (podmínka) příkaz [ else příkaz ] while (podmínka) příkaz
do příkaz while (podmínka)
for (výraz1; výraz2; výraz3) příkaz for (proměnná in pole) příkaz
break
continue
next
delete pole[index] exit [ výraz ]
{ příkaz[; příkaz ... ] }
Pole
Pole (arrays) se v awk předem nedeklarují.
// Příklad pole
{ x[NR] = $0 }
// Prvky lze indexovat i pomocí řetězců
{ x["modra"]++ }
// Konstrukce foreach
for (proměnná in pole) ...
// Zjištění zda prvek je obsažen v poli
if (hodnota in pole) print pole[hodnota]
// Odstranění prvků z pole
delete x["A","B","C"]
Funkce
Funkce se defuní následovně:
function jméno(seznam_parametrů) { příkazy }
Úkoly
-
Implementujte v awk zjednodušenou verzi wc: výpis počtu znaků, slov (řetězců oddělených mezerami) a řádků v textu.
1 bod
-
Implementujte v awk převrácení tabulkových dat (sloupce oddělené mezerami) podle hlavní diagonály, tj. výměnu řádků a sloupců.
1 bod