Trochu cvičení v bashi

Written in

by

Dnes makám na druhém úkolu na předmět PAA. V podstatě se jedná o to vymyslet nějakou heuristiku na řešení NP úplného problému. A pak to změřit a napsat o tom zprávu. Tu heuristiku moc rozebírat nebudu, ale chci si sem poznamenat jak jsem si zautomatizoval zběr výsledů. Jistě, mohl bych to vyzobávat přes schránku a dávat do excelu, ale hold jsem unixář a tak na to jdu přes roury a různé Text Processing Commands.

Konkrétně jsem měl binárku která vrací něco takového:

14-4-5-0-4  8 8936

Potřeboval jsem naměřit 3 problémy a pro každý v průměru 5 podproblémů a u každého jsem dostal 2 různé výsledky (s heuristikou a bez ní). Bohužel ten předpřipravený template co je na stránkách předmětu neměl udělané načítání hodnot ze vstupu (jinak by se to dalo ještě více zautomatizovat), ale hodnoty, které se počítaly byly zadrátované přímo uvnitř. No nic, začal jsem tím, že jsem si udělal copy&paste všech zadání a pomocí jednoduchého regulárního výrazu jsem z toho udělal tohle:

unsigned full_buckets[MAXBCKTS]  = {14,4,5,0,4};

Pak jsem postupně odkomentovával jednotlivé řádky a udělal si tak binárky pro jednotlivé zadání. Ty jsem pak pustil v jedné dávce všechny:

for binarka in bin/*1.*
    do $binarka >> vysledky/BFS_2.txt
done
for binarka in bin/*2.*
    do $binarka >> vysledky/BFS_2.txt
done
for binarka in bin/*3.*
    do $binarka >> vysledky/BFS_3.txt
done

Jen dodĂĄm Ĺže jednotlivĂŠ binĂĄrky se menovali kyble1.1, kyble1.2 atd. ZatĂ­mco tohle pĂ­ĹĄu tak to prohledĂĄvĂĄnĂ­ do šířky běží. Obdobně sem to udělal pro heuristiku, ale ta běží vĹždy jen asi sekundu, takĹže tam to nenĂ­ takovĂ˝ problĂŠm udělat přímo ručně. JenĹže teď jeĹĄtě jak to dostat do jednĂŠ tabulky, kde na jednom řádku budou vĂ˝sledky jak z heuristiky tak z BFS? JednoduĹĄe – prĂĄvě pomocĂ­ těch shellovĂ˝ch utilit:

paste BFS_1.txt heur_1.txt | \
expand | \
tr --squeeze-repeats ' ' | \
cut -f 1,2,3,5,6 -d ' '

Utilita na prvním řádku prostě vypíše vždy řádek prvního a vedle něj (tedy ne pod něj) vypíše řádek druhého souboru. Expand na druhém řádku jen z tabulátorů udělá mezery a více mezer za sebou jsou pomocí tr na třetím řádku přeloženy na jednu jedinou. To je potřeba pro cut, který už prostě jen vypíše určité sloupce, přičemž delimiter je mezera.

Tags

Napsat komentář