#####
##### reseni domacich ukolu
#####


# 5.1) 
cat romeo_and_juliet  | tr 'A-Z' 'a-z' | tr -c 'a-z' '\n' > slova
cat slova | sort | uniq -c | sort -nr | head -n 21 | tail -n 20

# 5.2) 
cat slova | rev | sort | uniq | rev

# 5.3) 
join -12 -v1 -o 1.1 prezident2id id2mesto

#####
##### Komentar k uniq -c | sort -n
##### NEBYLO NA CVICENICH
#####

# resime problem, jak napsat co nejlepe idiom uniq -c | sort -n
# na prikladu 5.1) z domaciho ukolu
# tak, aby fungoval vsude
# (vyzkousejte a rozmyslete)

# 1) numericke vs nenumericke
printf '1\n2\n10' | sort
# vs
printf '1\n2\n10' | sort -n

# 2) sort je ovlivnen nastavenim locale
# (jazykove nastaveni ovlivnujici e.g. ceske formatovani data);
# standardniho chovani docilite nastavenim klasickeho C locale
export LC_ALL=C ; ( printf 'a\nb\nA\nB' | sort )
export LC_ALL=en_US.UTF-8 ; ( printf 'a\nb\nA\nB' | sort )
# pripadne na prikladu ze cviceni
export LC_ALL=C ; (cat zminulych_cvik | sort | uniq -c | sort -r | head -n 5)
export LC_ALL=en_US.UTF-8 ; (cat zminulych_cvik | sort | uniq -c | sort -r | head -n 5)

# zatimco tedy na C locale se nas vzorovy idiom
cat slova | sort | uniq -c | sort -r | head 
# chova stejne jako
cat slova | sort | uniq -c | sort -rn | head 
# tak na en_US to ekvivalentni neni.

# 3) ale uniq -c se zda, ze zarovnava zleva mezerami a tedy by (s LC_ALL=C)
# varianta ukolu se sort -n  mela fungovat stejne jako se sort
printf '  681\n    9' | sort 
printf '  681\n    9' | sort -n

# nicmene http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uniq.html
# ten padding nespecifikuje, takze uplne prenositelne & korektni reseni by melo (imo) byt

cat slova | sort | uniq -c | sort -b -n -r | head 

# vyhoda je, ze se explicitne tridime podle ciselne hodnoty
# misto toho, abychom spolehali na konkretni format vystupu uniq

#####
##### Cviceni:
#####

# opakovani cut/paste
# převeďte v souboru /etc/passwd pátý sloupec (user info, resp. jméno)
# na velká písmena, ostatní sloupce nechte jak jsou. Tzn, první řádek výstupu bude něco jako:
# root:x:0:0:ROOT:/root:/bin/bash

cat /etc/passwd | cut -d: -f 1-4 > pred
cat /etc/passwd | cut -d: -f 5 | tr a-z A-Z > velky
cat /etc/passwd | cut -d: -f 6 > po
paste -d : pred velky po

#
# Pocitani
#

# aritmeticka expanze $(( 2 + 2 )) vs. expr vs. bc
# man expr
# man bc (bc je celkem silny programovaci jazyk pro pocitani, pozdeji budeme mit awk)

# 2 + 3
echo $((2 + 3)) 
expr 2 + 3
echo '2 + 3' | bc
# 2*(3+5) 
echo $((2*(3+5))) 
expr 2 '*' \( 3 + 5 \)
echo '2*(3+5)' | bc
# 2.2 * 17.4
# expr ani $(( )) neumi desetinna cisla
echo '2.2 * 17.5' | bc

#
# programovani v shellu
#

# $0 ... $9 - parametry skriptu 
# $# pocet argumentu (nepocitaje 0-ty)
# $@ schvalne co asi je?
# shift  posouva argumenty

# nanoulozka: program co secte 2 cisla
# (syntax << NECO se jmenuje Here Document, viz man bash)
cat > secti.sh << 'EOF'
#!/bin/sh

expr "$1" + "$2"
EOF

chmod +x secti.sh
./secti.sh 1 2

# nasledujici konstrukty byly jen ukazany, priste podrobneji

# if test 
# if [
# man test
# man [
A=1
if [ "$A" -gt 0 ] ; then
	echo je kladne
else
	echo neni kladne
fi

# for
for cislo in $(seq 10) ; do
	echo "$(($cislo + 5))"
done

# while
echo from her
while yes ; do
	echo to eternity
done

# while read idiom
# vice o read a IFS nekdy
seq 10 | while read cislo ; do 
	echo $cislo
done
