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
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 }
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