Menu

Desáté cvičení (26. 4.)

Materiály

Příklady

Zobrazit řešení Vyřešte následující úlohy pomocí AWK:
  1. Napište program, který ze vstupu načte na každém řádku jedno číslo a vypíše jejich součin.
  2. #!/usr/bin/awk -f
    BEGIN { soucin=1 }
    { soucin *= $1 }
    END { print soucin }
    
  3. Napište program, který ze vstupu načte na každém řádku jedno číslo, vypíše jejich střední hodnotu (průměr) a rozptyl.
  4. #!/usr/bin/awk -f
    BEGIN { RS=""; FS="\n"; avg=0; var=0; }
    { 
        for (i=1; i<=NF; i++) { avg += $i }
        avg /= NF
    
        for (i=1; i<=NF; i++) { var += (avg-$i)*(avg-$i) }
        var /= NF
    
        print "Průměr: " avg
        print "Rozptyl: " var
    }
    
  5. Napište program, který převede matici na vstupu do odstupňovaného tvaru (pomocí gaussovy eliminační metody).
  6. Najděte si v man 1p awk sekci String functions. Nechte si ji otevřenou, bude se hodit.
  7. Napište program, který ze vstupu odstraní komentáře různého druhu. Vyzkoušejte formu #, //, Pascal, ale také /* ... */. Začněte s každým zvlášť a rozmyslete si, jak je spojit. Pokud nejste fajnšmekři, tak se nemusíte trápit tím, že by komentáře mohly být třeba ve stringové konstantě jako v C (printf("// muhehe");).
  8. Pro odstranění jednoduchých jednořádkových komentářů je stačí použít jako field separator.

    #!/usr/bin/awk -f
    BEGIN { FS="#" }
    { print $1 }
    

    Odstranění víceřádkových komentářů je složitější, záleží na tom, zda může na stejném řádku jeden komentář končit a druhý začínat. Pokud ano, budeme si muset pohrát s nahrazováním a regulárními výrazy (využijete funkci gsub).

  9. Napište program, který ze vstupu nahradí více sousedních prázných řádků jedním.
  10. #!/usr/bin/awk -f
    BEGIN { empty=0 }
    /^$/ { empty++ }
    !/^$/ && empty > 0 { empty=0; print "" }
    !/^$/ && empty == 0 { print }
    END {
        if (empty>0) { print "" }
    }