Stránka 1 z 1

Zkouška 09.06.2011

Napsal: 9. 6. 2011 19:23
od biylda
Nová úloha. Úkolem bylo naprogramovat trochu modifikovaný příkaz diff, přičemž bylo možné použít příkaz comm. Výpis příkazu comm ani soubory samotné se nevejdou do paměti. Výpis výsledného diffu se již vejde. Klasický comm potřebuje dostat setříděné soubory, ale tím se není třeba zabývat. Lze předpokládat, že již jsou setříděné předány diffu, nebo náš comm umí pracovat i s nesetříděnými.

Parametry:

Kód: Vybrat vše

          vypíše to, co klasický diff
-e        vypíše to, co klasický diff -e
-U n      vypíše to, co klasický diff -C n, alespoň myslím
-s        vypíše to, co klasický diff -s (my jsme to neměli, ale budoucí studenti budou :)
-x p1     p je porovnávací vzor (lze si zvolit, jestli wildcard či regexp), při porovnávání adresářů vyhovující soubory vyloučí
-x p2     lze zadat více vzorů
...   
-X s       soubor s porovnávacími vzory, neslučitelný s přepínači (-x), každý vzor na jednom řádku souboru
vstupní soubor/adresář 1
vstupní soubor/adresář 2
Řešení:
Parametry zpracovat klasicky v shellu. Samotný diff je nejjednodušší dělat v AWK, kterému nasypeme výstup z commu. Výstup commu: 1. sloupec je řádka vyskytující se v obou souborech, 2. pouze v prvním souboru, 3. pouze v druhém souboru. Je potřeba si průběžně počítat, kolikátou řádku z prvního respektive druhého souboru právě zpracováváme, abychom pak mohli vypsat ty intervaly. Na výpis intervalu jsem si napsal funkci (vypíše buď jedno číslo nebo interval). Když máme něco v prostředním (NF=2), či pravém (NF=3) sloupci, tak sbíráme data.

Kód: Vybrat vše

BEGIN { FS="\t" }
NF==2 { prostřední sloupec, přidej řádku do prvni }
NF==3 { pravý sloupec, přidej řádku do druhy }
NF==1 { první sloupec, pokud byl předtim NF != 1, vypíšeme potřebné údaje a případně řádky z prvni a druhy }
Takto napsané to ale nevypíše poslední změnu. Buď je třeba do ENDu dát to samé, co do NF==1, nebo na konec výstupu commu ještě přidat řádku s tečkou.
Parametr (-e) je možné zpracovat tím samým algoritmem, jen mírně editovaným. Editací se myslí, že použijete ten samý algoritmus, který se sám rozhodne podle (-e), ne že se vezme druhý papír, celé se to opíše a změní se jedna řádka - to se Forstovi nelíbí. Já to dělal tak, že jsem si nejdřív vypsal klasický diff a pak to jenom převedl na formát (-e) pomocí edu, viz Forstova kniha.

Při porovnávání složek je vhodné všechny vzory naházet do jednoho souboru a pak výpis ls projet grepem. Já jsem si z těch vzorů udělal příkazy pro sed (delete) a šoupnul jsem to sedu jako script file. Pokud je nějaký soubor v obou adresářích, tak na tyto soubory spustit diff, jinak je to klasický výpis jako u standartního diffu. Opět použít comm a zbytek je vhodné dělat shellem (akorát je třeba si dát pozor na porovnávání tabulátorů), ale i v awk to jakž takž jde.

Parametr (-U) vypíše i n řádek okolo rozdílu, ale pokud to zasahuje do dalšího rozdílu, tak se ty rozdíly myslím nějak spojí. O toto se pokoušeli asi jen dva lidi.

Výsledky:
AFAIK, z 17 lidí
3x 1
3x 2
2x pohovor

Re: Zkouška 09.06.2011

Napsal: 9. 6. 2011 20:44
od miloss
Kompletní Výsledky:

3x1
3x2
2x3
5xPRYČ
2x pohovor

POHOVORY
1xPRYČ
1x3
a moje "3" se změnila na "2", protože spíš jen nepochopil můj spíš-matematický přístup k věci (u -e se nechaly čísla řádek spočítat snadno a nemuselo se nic převracet.. apod)


CELKEM tedy

3x1
4x2
2x3
6xPRYČ