Ulohu jsem vyresil skriptem pristupnym na tomto hyperaktivnim odkaze Nahled skriptu k uloze 12 Skript ktery predkladam je resenim ulohy pro libovolny pocet souboru tedy zahrnuje i spojeni tri souboru.
Vstupem skriptu jsou soubory s daty ktere chceme spojit. Minimalni pocet techto souboru je 2. Soubory skriptu predavame pomoci jejich umisteni. Pokud se jedna o soubory ve stejnem adresari kde se nachazi skript predame pouze jejich nazvy. Predavani souboru probiha pres argumenty skriptu. Priklad tohoto predani: ./proper_uloha12 a.txt b.txt c.txt Kde a.txt, b.txt, c.txt jsou prave soubory ktere chceme spojit.
Prvni cast skriptu se stara o serazeni predanych souboru. K tomuto ukolu pouziva program sort uvnitr cyklu for, ktery se postara o nacteni jednotlivych predanych souboru. Sortovany soubor pak ukladam pomoci presmerovani do souboru s pozmenenym nazvem. Napriklad setrideny soubor a.txt bude mit nazev a.txt-sort.
Druha cast skriptu se stara o spojeni jednotlivych souboru. Program join spojuje pouze dva soubory najednou proto je nutne skonstruovat prihodnou smycku, ktera spoji soubory po parech. Na zacatku spojim dva prvni soubory do souboru complet.txt. Pote posunu radu argumentu o dva tim dostanu na prvnim miste argumet, ktery se nachazel na miste tretim. Nyni stoupim do smycky ktera overuje pocet argumentu a ceka dokud nebude roven nule. Uvnitr smycky nejdrive prekopiruji souibor complet.txt do pomocneho souboru pomfile. Pote provedu join na pomocnem souboru a sesortovanem souboru, ktery prislusi prvnimu souboru v argumentech (pripominam ze byl jiz proveden shift o dve mista). Toto spojeni znovu presmeruji do souboru complet.txt. Posledni prikaz cyklu je znovu shift ale pouze o jedno misto. Takto bude cyklus pokracovat doku se argumenty pomoci shiftu nezredukuji na nulu. Posledni prikaz cyklu je rm ktery smaze vsechny doceasne soubory. Tedy vsehcny soubory sort a pomocny soubor pomfile.
Vystupem skriptu je jediny soubor complet.txt, ktery obsahuje spojene data z predanych souboru.
Ulohu jsem vyresil skriptem pristupnym na tomto hyperaktivnim odkaze Nahled skriptu k uloze 21
Skript nema zadny externi vstup jeho vystup je fixovany.
Skript je tvoren z nekolika vnorenych cyklu while. Jedna se o konstrukci kdy v jednom cyklu while, ktery se stara o nagenerovani spravneho poctu souboru (12ti), jsou vnoreny dalsi dva paralelni cykly ktere se staraji o zapis znaku do souboru. Generaci souboru urcitych velikosti jsem provedl jednoduse vytvorenim souboru v kterem je urcity pocet znaku. V mem pripade pro usporu casu jsem pouzil velkou radu nul. Dva cykly jsem zvolil kvuli dodrzeni pozadovaneh rozzahu. Vice se o jednotlivych cyklech nize.
Hlavni cyklus kontroluje aby byl dodrzen zadany pocet souboru. Zaciname na fixni hodnote 12 a snizujeme o jednicku po kazdem projiti. Uvnitr hlavniho cyklu se na prvnim miste vytvori promena my_rand, ktera se stara o dodrzeni velikosti souboru. Pomoci bashovske promene RANDOM nageneruji nahodne cislo a to pak moduluji cislem 15361, ktere zaridi bytovaci normu.
Prvni vedlejsi vnoreny cyklus se stara o zapisovani nul do souboru *.log. Jeho pusobeni je ukonceno ve chvili kdyz promena my_rand bude mensi nebo rovna stu. Tato promena je v tomto cyklu zmensovana prave o sto. Tento cyklus se da vuci nasledujicimu cyklu chapat jako makro zapisovatel.
Druhy vedlejsi vnoreny cyklus ma stejnou funkci jako prvni vedlejsi cyklus, az na rozdil ve velikosti zapisu do souboru. Zde se jiz zapisuje pouze po jedne nule a cyklus konci kdyz promena my_rand dosahne hodnoty nula. Promena my_rand se zde zmensuje kazdym projitim presne o jedna. Tim je zajistena presnost rozsahu velikosti souboru.
Vystupem skriptu je 12 souboru typu file[1-2]*.log, ktere maji nahodou velikost mezi 0-15kB. Nahodnost velikosti stanovuje nahodnost sytemove promene RANDOM.
Vypracoval Jakub Kelar, 2012.