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

  1. 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

  2. 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