Seminár k operačným systémom: Cvičenie 8 [awk a sed]

Použité články

Väčšina úloh pochádzala z dvojice článkov:

Dodatočné úlohy pracovali nad súborom /tmp/cisari.txt:

Meno, Datum narodenia a umrtia, datum panovania
-----------------------------------------------
Frantisek Jozef I., 1887-1922, 1848-1916
Karol I. Habsbursky, 1830-1916, 1916-1918
Ferdidand I. Dobrotivy, 1793-1875, 1835-1848
Frantisek II. Habsbursky, 1768-1835, 1792-1835
Leopold II. Habsbursky, 1747-1792, 1790-1792
Jozef II., 1741-1790, 1765-1790
Maria Terezia, 1717-1780, 1740-1780

Nájdite najdlhšie vládnuceho vládcu/vládkyňu

#!/bin/awk -f

BEGIN {
        FS=", "
        MAX = 0;
        NAJDLHSI = ""
}

NR >= 3 {
        split($3, ROKY, "-")
        print $1,  ROKY[2] - ROKY[1]

        if (ROKY[2] - ROKY[1] > MAX) {
                MAX = ROKY[2] - ROKY[1]
                NAJDLHSI = $1
        }
}

END {
        print "============="
        print NAJDLHSI, MAX
}
  • použime shebang line, tak ako v prípade bežných shellskriptov
  • awk potrebuje parameter -f pre uvedenie cesty k súboru so skriptom
  • nastavíme field separator v BEGIN, lebo v shebangu sa nastavuje cez -F podivným spôsobom.

Alternatívne

#!/bin/awk -f

BEGIN {
        FS=", "
        OFS="|"
}

NR >= 3 {
        split($3, ROKY, "-")
        print $1,  ROKY[2] - ROKY[1]
}

Voláme

./najdlhsi_vladca2.awk < /tmp/cisari.txt | sort -t'|' -k2nR
  • Nastavíme výstupný oddeľovač OFS na rúru.
  • Triedime potom podľa druhého stĺpca (-k2), numericky (lebo inak sa použije lexikografické triedenie, kde 1 < 13 < 2) a obrátene. Výsledok voliteľne obsekneme headom.

Vygenerujte SQL INSERTy do databázy

#!/bin/awk -f

BEGIN {
        FS=", "
        OFS=","
}

NR > 2 {
        split($2, ZIVOT, "-")
        split($3, VLADA, "-")

        print "INSERT INTO cisari VALUES ('" $1 "'", ZIVOT[1], ZIVOT[2], VLADA[1],  VLADA[2] ");"
}
  • nastavíme výstupný oddeľovač na čiarku
  • vygenerujeme separátne INSERTy, lebo pri hromadnom použití sa nevieme zbaviť koncovej čiarky.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *