---
# System prepended metadata

title: Úkoly – Bash II &c

---

# Ú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)
