# Úkoly – Bash II &c
## 1. Grepování yamlů
Procvič si příkazy jako `ls`, `wc`, `grep` a jak je spojit dohromady.
Stáhni a rozbal si tyto archivy s informacemi o komunitních akcích: kurzech/srazech PyLadies a srazech Pyvo.
$ wget -O pyladies-cz.zip https://github.com/PyLadiesCZ/pyladies.cz/archive/master.zip
$ unzip pyladies-cz.zip
$ wget -O pyvo-data.zip https://github.com/pyvec/pyvo-data/archive/master.zip
$ unzip pyvo-data.zip
Data si prohlédni a zjisti, co se v nich skrývá za informace. Zvlášť doporučuju třeba soubor `pyvo-data-master/series/brno-pyvo/events/2018-10-25-casove.yaml`.
Použij základní shellové příkazy (ne Python) na zodpovězení otázek níže.
> YAML soubory by se správně měly číst knihovnou na YAML, aby byla zachována struktura. Ty je ale ber jako "čistý text", kde hledané informace jsou na řádcích ve tvaru `klíč: hodnota` (případně s nějakýma mezerama a/nebo pomlčkama navíc).
> Odpovědi tak nemusí být 100% přesné.
>
> "Zakomentované" informace (začínající `#`) počítej pro jednoduchost taky.
1. Kolik bylo Pyv v Brně?
* *Pro každý sraz existje soubor.*
2. Kolik bylo Pyv celkem?
3. Z kolika přednášek na Pyvech jsou videa? *(Předpokládej že každá přednáška může mít max. 1 video)*
* *Videa jsou označena `video:`*
4. Kolik bylo kurzů/srazů PyLadies?
* *Srazy jsou v adresáři `meetups/` a každý má jméno, `name:`*
5. (Bonusová výzva) Z kolika Pyv jsou videa?
### Nápověda
Šablonami jako `adresar/*/podadresar/*` můžeš vybrat soubory z více adresářů.
Příkaz `grep` má zajímavé přepínače `-l`/`-L`, `-h`/`-H` a `e`.
## 2. Uniq
Příkaz `uniq` odstraní *po sobě jdoucí* duplikované řádky:
```console
$ echo '
> jedna
> dva
> dva
> tři
> tři
> tři
> jedna
> ' | uniq
jedna
dva
tři
jedna
```
Často se používá `sort | uniq`, aby se stejné řádky z celého souboru dostaly k sobě.
Použij `uniq` k zodpovězení těchto otázek:
6. Vypiš všechna místa konání Pyv (stačí mít na každém řádku identifikátor jako `artbar`).
7. Přidej informaci o tom, kolikrát na kterém místě Pyvo bylo.
Příkaz `uniq` má zajímavý přepínač `-c`.
### Bonusová výzva
Existuje zajímavý příkaz `cut`, který má zajímavé přepínače `-d` a `-f`.
8. Jaké jsou 3 nejčastější křestní jména organizátorů/koučů/atd. PyLadies?
## 3. Vlastní příkaz
Níže je funkce v Pythonu, která bere řetězec a vrátí "obrácený" řetězec: znaky jsou v něm pozpátku a nahrazené podle slovníku.
Tvůj úkol je napsat příkaz pro příkazovou řádku, který bude radost použít v Bashi.
Detaily níže.
```python
obracena_pismena = {
'a': 'ɐ', 'b': 'q', 'c': 'ɔ', 'd': 'p', 'e': 'ǝ', 'f': 'ɟ', 'g': 'ƃ',
'h': 'ɥ', 'i': 'ᴉ', 'j': 'ɾ', 'k': 'ʞ', 'l': 'l', 'm': 'ɯ', 'n': 'u',
'o': 'o', 'p': 'd', 'q': 'b', 'r': 'ɹ', 's': 's', 't': 'ʇ', 'u': 'n',
'v': 'ʌ', 'w': 'ʍ', 'x': 'x', 'y': 'ʎ', 'z': 'z', 'A': '∀', 'B': 'B',
'C': 'Ɔ', 'D': 'D', 'E': 'Ǝ', 'F': 'Ⅎ', 'G': 'פ', 'H': 'H', 'I': 'I',
'J': 'ſ', 'K': 'ʞ', 'L': '˥', 'M': 'W', 'N': 'N', 'O': 'O', 'P': 'Ԁ',
'Q': 'Q', 'R': 'R', 'S': 'S', 'T': '┴', 'U': '∩', 'V': 'Λ', 'W': 'M',
'X': 'X', 'Y': '⅄', 'Z': 'Z', '0': '0', '1': 'Ɩ', '2': 'ᄅ', '3': 'Ɛ',
'4': 'ㄣ', '5': 'ϛ', '6': '9', '7': 'ㄥ', '8': '8', '9': '6', ',': "'",
'.': '˙', '?': '¿', '!': '¡', '"': '„', "'": ',', '`': ',', '(': ')',
')': '(', '[': ']', ']': '[', '{': '}', '}': '{', '<': '>', '>': '<',
'&': '⅋', '_': '‾',
}
def obrat(text):
return ''.join(obracena_pismena.get(c, c) for c in reversed(text))
```
Příklad použití v Pythonu:
```pycon
>>> obrat("Ahoj, PyLadies!")
"¡sǝᴉpɐ˥ʎԀ 'ɾoɥ∀"
```
Program pro příkazovou řádku by měl být spustitelný (zařiď pomocí `chmod`).
Po zkopírování do správného adresáře by měl jít spustit pomocí příkazu `obrat`.
Když nedostane žádný argument, obrátí standardní vstup:
```console
$ echo Ahoj | obrat
ɾoɥ∀
```
Jednotlivé řádky by měl program zpracovávat samostatně:
```console
$ echo 'Ahoj,' > pozdrav.txt
$ echo 'PyLadies' >> pozdrav.txt
$ cat pozdrav.txt
Ahoj,
PyLadies
$ cat pozdrav.txt | obrat
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
```
Pokud `obrat` dostane argumenty, zpracuje dané soubory:
```console
$ obrat pozdrav.txt
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
$ obrat pozdrav.txt pozdrav.txt
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
```
Argument `-` znamená standardní vstup.
```console
$ echo Ahoj | obrat -
ɾoɥ∀
$ echo haha | obrat pozdrav.txt - pozdrav.txt
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
ɐɥɐɥ
'ɾoɥ∀
¡sǝᴉpɐ˥ʎԀ
```
Pokud dostane přepínač `--help`, vypíše krátkou nápovědu a ignoruje ostatní argumenty.
Je-li použit jiný přepínač (začínající `-`) a ne `--help`, program uživateli vynadá (na chybovém výstupu), vrátí chybovou návratovou hodnotu (`exit(1)`) a ignoruje ostatní argumenty.
```console
$ obrat -x
Přepínač -x neexistuje, viz --help
$ obrat --cislovani-radku > vystup.txt
Přepínač --cislovani-radku neexistuje, viz --help
$ echo $?
1
```
Nakonec program změň tak, aby když některý znak chybí ve slovníku, vracel chybovou návratovou hodnotu `2`. Pořád ale zpracuje celý vstup.
```console
$ echo Ahoj | obrat
ɾoɥ∀
$ echo $?
0
$ echo Čau | obrat
nɐČ
$ echo $?
2
```
### Nápověda k Pythonu
Naimportuješ-li `sys` a `os`, pak:
* `sys.argv` je seznam argumentů (včetně jména programu)
* `sys.stdin` je *už otevřený* soubor se std. vstupem (netřeba `with` či `close`)
* Podobně `sys.stdout` je soubor se standardním výstupem (tam píše `print`) a `sys.stderr` je soubor chybovým výstupem.
* `os.environ` je slovník* s proměnnýma prostředí
* `exit(1)` ukončí program s danou hodnotou
(* přesněji řečeno, objekt který se chová jako slovník)