# Úvod do UNIXu (SWI095x1h), 12. cvičení, 2005-05-18
# SU1, Malá Strana, MFF UK
#
# Řešení jsou odladěná na FreeBSD 4.11-RELEASE, případné konkrétní situace
# se týkají stroje mail.kolej.
#
# $DevNullCZ: cviceni-12.reseni.txt,v 1.1 2005/05/18 19:18:01 jp Exp $
#

#---------------------------------------------------------------------------
# AWK - NEPOUžÍVEJTE sed, grep, cut, ...
#
# v příkladech budou použity tyto soubory:
#
# http://www.devnull.cz/mff/uvod-do-unixu/emp.data (1. sloupec je jméno
# zaměstnance, 2. je hodinová mzda, 3. je počet odpracovaných hodin; soubor
# převzat z klasické knihy "Aho, Kernighan, Weinberger: The AWK Programming
# Language")
#---------------------------------------------------------------------------

(a1) základní informace, historie, struktura AWK programu, patterns/actions,
datové typy, BEGIN/END, pole ve vstupních řádkách, built-in proměnné,
syntaxní analýza programu, ...

(a2) vypište soubor emp.data

## awk '{ print }' emp.data

(a3) vypište jména a celkový plat těch zaměstnanců, kteří odpracovali
alespoň jednu hodinu. Jako další příklad pak vypište naopak jen jména
zaměstnanců, kteří nepracovali.

## awk '$3 > 0 { print $1, $2 * $3 }' emp.data
##
## awk '$3 == 0 { print $1 }' emp.data

(a4) pro každého zaměstnance vypište počet slov na příslušné řádce (zde tedy
budou čísla stejná). Příklad na built-in proměnnou "NF".

## awk '{ print $1, NF }' emp.data

(a5) před každou řádku vypište pořadové číslo řádky

## awk '{ print NR, $0 }' emp.data

(a6) pro každého zaměstnance vypište řádku, jejíž formát bude tento:

total pay for Katy is 40

## awk '{ print "total pay for", $1, "is", $2 * $3 }' emp.data

(a7) vypište takové zaměstnance společně s výší mzdy, kteří si vydělali více
než $50

## awk '$2 * $3 > 50 { print $1, $2 * $3 }' emp.data

(a8) vypište řádky souboru emp.data, ale před první řádek vypište tuto
hlavičku a za ní prázdný řádek:

NAME    RATE    HOURS

## awk 'BEGIN { print "NAME\tRATE\tHOURS"; print "" }; {print}' emp.data

(a9) vypište pouze jednu řádku, na které budou jména všech zaměstanců; toto
je příklad na spojování řetězců.

## awk '{ employees = employees $1 " " }
##      END { print employees }' emp.data

(a10) vypište poslední řádku souboru emp.data. Příklad na to, že "$0" jako
proměnná obsahující celou řádku si neponechá svojí hodnotu pro END podmínku.

## awk '{ line = $0 }; END { print line }' emp.data

(a11) vypište průměrný plat zaměstnanců, kteří vydělávají více než $6 za
hodinu. Stejný příklad pak zkuste pro ty, co vydělávají více než $4 za
hodinu. Použijte "if" příkaz pro ochranu dělení nulou.

## awk '$2 > 6 { ++n; sum += $2 * $3 }
##      END    { if (n == 0)
##                 print "no such employee"
##               else
##                 print sum / n
##             }' emp.data

#---------------------------------------------------------------------------
# AWK 2
#---------------------------------------------------------------------------

(a12) vypište UID/GID z /etc/passwd tak, že bude mezi nimi znak '_'.
Použijte "FS" pro čtení, "next" pro ignorování komentářů.

## awk 'BEGIN { FS=":" }; { if (/^#/) next; print $3 "_" $4 }' /etc/passwd

(a13) vypište ty řádky z /etc/passwd, které obsahují slovo "Jan"

## awk '/Jan/' /etc/passwd

(a14) obraťte řádky souboru

## awk '{ lines[NR]=$0}; END { for (i=NR; i > 0; --i) print lines[i] }'

(a15) vypište ty řádky /etc/passwd, které jsou mezi řádky obsahující slova
Friedel a Pechanec.

## awk '/Friedel/, /Pechanec/' /etc/passwd

(a16) pomocí split(,,) zpracujte soubor /etc/passwd tak, že vypíšete login a
jméno uživatele

## awk '/^[^#]/ { split($0, ln, ":"); print ln[1], ln[5] }' /etc/passwd

(a17) pro každý řádek souboru vypište jeho pole každé na vlastní řádek.
Použijte "while".

## awk '{ i=1; while (i <= NF) { print $i; ++i} }'