Úvod do UNIXu – cvičení 20. 5. 2016

Řešení domácích úkolů z minula

  1. Napište shellový skript, který se bude chovat podobně jako nástroj cut. Tj. bude rozpoznávat parametry -d a -f, které budou mít v zásadě týž formát a význam jako u cut. V dalších parametrech budou cesty k souborům. Pokud žádné nebudou uvedeny, měl by se jako okbvykle číst přímo standardní vstup. Rozdíl je v tom, že váš skript by měl na výstupu umístit sloupce v pořadí daném parametrem -f. V cut jsou totiž sloupce vypisované v pořadí, v jakém jsou ve vstupním souboru. Příklad použití je následující.
            
    # vypíše uživatele systému ve formátu "UID:login"
    ./cut.sh -d: -f 3,1 /etc/passwd
    # analogicky ve formátu "login:login:login"
    cat /etc/passwd | ./cut.sh -d : -f1,1,1
    # či ve formátu "UID:UID:GID:login"
    ./cut.sh -d : -f 3,3-4,1 < /etc/passwd
            
          
    Vyjma nástroje awk smíte použít cokoliv. Snažte se však držet standardu POSIX. (2 + 2 body)
            
    #!/bin/bash
    
    oddelovac="$(printf '\t')"
    sloupce=''
    
    for x in 1 2; do
       case "$1" in
          -d) oddelovac="$2"; shift 2;;
          -d?) oddelovac="$(echo "$1" | cut -c 3-)"; shift 1;;
          -f) sloupce="$2"; shift 2;;
          -f*) sloupce="$(echo "$1" | cut -c 3-)"; shift 1;;
       esac
    done
    
    if [ -z "$sloupce" ]; then
      exit 0
    fi
    
    sloupce="$(echo "$sloupce" | tr ',' ' ')"
    
    
    zpracuj_soubor() {
    
      cat "$1" | while read radek; do
    
        vysledek=''
    
        for sloupec in $sloupce; do
    
          if [ -n "$vysledek" ]; then
            vysledek="$vysledek$oddelovac"
          fi
    
          vysledek="$vysledek$(echo "$radek" | cut -d "$oddelovac" -f "$sloupec")"
        done
    
        echo "$vysledek"
      done
    }
    
    
    if [ $# -eq 0 ]; then
      zpracuj_soubor -
    else
      for soubor in "$@"; do
        zpracuj_soubor "$soubor"
      done
    fi
            
          

Příkazy a úkoly na cvičení