9. Linux Shell parancsok 104
10.3. Adatok rendezése
A sort parancs
A sort utasítás minden sor legels® karaktere szerint m¶ködik. Ha az els® karakterek megegyeznek, akkor a második, harmadik, stb. karaktereket hasonlítja össze. A rende-zés a szokásos ASCII kódok esetén az írásjelek számok nagybet¶k kisbet¶k sorrend szerint történik. Az -r kapcsolóval a rendezési sorrendet teljesen megfordíthatjuk. Az -n kapcsolóval numerikusan rendezhetjük a sorokat. Az állomány sorai néha oszlopokba rendezett adatok mez®it tartalmazzák. A mez®k között valamilyen határoló vagy elvá-lasztó jelnek kell állnia, ez alapesetben a szóköz vagy a tabulátor. Ha a sort parancsot a +Szám kapcsolóval használjuk, a Szám által meghatározott mez®t kihagyva végzi a sorba rendezést. A -Szám hatására a rendezés a Számnál megadott mez®nél ér véget.
A sort parancsnak számos alkalmazási lehet®sége van. Az egyik legfontosabb az adatok mediánjának megkeresése. A medián az az érték, aminél az adatok fele kisebb, fele nagyobb. Páratlan számú adatnál ez éppen a sorba rendezett adatsor középs® eleme, páros számú adatnál pedig a két középs® elem.
Másik lehet®ség az adatok ún. kumulatív gyakoriságeloszlásának meghatározása.
A wc parancs
A bet¶k, szavak, és sorok leszámlálására használjuk a wc (word count) parancsot. Ha tehát a középs® elemet keressük, akkor el®ször számláljuk le az adatokat a wc paranccsal, majd osszuk el a kapott értéket kett®vel.
A uniq parancs
A uniq parancs kisz¶ri az egy állományban található egymás után ismétl®d® sorokat, és csak egyszer írja ki az ismétl®d® sort (célszer¶ lehet ezért az állományt el®ször a sort
utasítással rendezni). A parancsot olyankor használjuk, amikor például egy listában ki akarjuk sz¶rni az ismétléseket. A parancsnak a kapcsolókon kívül két argumentuma le-het, a bemeneti és a kimeneti állomány. Ezek hiányában a standard kimenetre illetve bemenetr®l dolgozik. A parancs alapértelmezésben teljes sorokat hasonlít össze. Lehe-t®ség van arra is, hogy az összehasonlítás során ne vegyen gyelembe megadott mez®ket (a mez® egy olyan karaktersorozat, melyet egy vagy több elválasztókarakter általában szóköz vagy tabulátor választ el egy másik karaktersorozattól).
A -c kapcsoló hatására a sorok elé kiírja az ismétlések számát is. Ha ezt a kapcsolót használjuk egy sorba rendezett adatfájlon, akkor könnyen megkaphatjuk a leggyakoribb elemet (az adatok módusza). Ehhez csupán a gyakoriság szerint kell sorba rendezni az adatokat.
10.4. Példák és feladatok
Feladatok
F10.1. Írassuk ki az echo paranccsal a következ® mondatokat:
1. "$HOME, sweet $HOME"
2. "$HOME, sweet [$HOME értéke ]"
3. 'Azt mondta az öreg tímár: "Ez az ulti nem ulti már."'
F10.2. Listázzuk ki, és számoljuk meg a /usr/lib könyvtárban és az összes alkönyvtá-rában az összes olyan fájlt, amelynek utolsó el®tti bet¶je e.
F10.3. A sort és a uniq parancsok segítségével keressük meg a mellékelt adatfájl módus-zát, azaz a leggyakoribb elemet. Rendezzük gyakoriság szerint sorba az adatokat és ábrázoljuk a gyakoriság-eloszlást gnuplottal. Próbáljuk meg az x tengely cím-kézését az egyes kategóriáknak megfelel®en megváltoztatni (Útmutatás: a gnuplot interaktív használatával kérjünk segítséget a help set xlabel paranccsal).
F10.4. A sort, a uniq és a wc parancsok használatával keressük meg a mellékelt adatfájl mediánját, azaz azt az elemet, aminél az adatok fele kisebb, illetve nagyobb.
F10.5. A mellékelt adatfájlban a Mauna Loa obszervatóriumban 1974 és 1987 között mért CO2 koncentrációk találhatóak havi felbontással (http://itl.nist.gov).
Készítsünk kumulatív gyakoriságeloszlást, azaz az koncentráció függvényében áb-rázoljuk, hogy az adott értéknél hányszor fordul el® kisebb mért érték. Az eloszlást ábrázoljuk gnuplottal, és illesszük be egy LATEX dokumentumba.
F10.6. Számoljuk meg, hány olyan fájl van az /usr könyvtárban ami c vagy v bet¶vel kezd®dik, és o bet¶re végz®dik. Azok az útvonalak, amit nincs jogunk olvasni hibát emelhetnek, gondoskodjunk róla, hogy a hibaüzenet a keres.err állományba kerüljön.
F10.7. Adott egy tömörített naplófájl, ami egy számítógép hálózati forgalmának cso-magjait indulási és érkezési eseményeit tartalmazza. Ismerkedjünk meg a naplófájl szerkezetével. Az els® oszlopban az id®bélyegek olvashatóak. Készítsük el kü-lön a kimen® illetve kükü-lön a bejöv® csomagok között eltelt id®tartamok eloszlását.
Készítsünk ezekr®l gnuplot ábrákat. Határozzuk meg, hány bájt adat érkezett a sportgeza.hu szerverr®l a kliensre.
11. fejezet
Szimulációs feladatok
11.1. Példák és feladatok
Feladatok
F11.1. Piszkos Fred, a kapitány, miután meglehet®sen sok rumot fogyasztott, végtelen bolyongásba kezd: 1/21/2 valószín¶séggel balra vagy jobbra indul az Origó nev¶
vendéglátóipari egységb®l. Minden lépés után megpihen, majd ismét azonos való-szín¶séggel lép egyet jobbra vagy balra. Szimuláljuk a kapitány mozgását gawkkal!
1. Írjunk egy gawk szkriptet, amely T = 10 id®lépés után kiírja a kapitány po-zícióját. (Útmutatás: a programot a BEGIN blokkba írjuk. Véletlen számokat rand() függvénnyel kaphatunk, melyet a srand() függvénnyel inicializálha-tunk.)
2. Módisítsuk az el®z® szkriptet úgy, hogy ne egyszer, hanem N = 10 000-szer írja ki a kapitány pozícióját T = 10 lépés után.
3. Az el®z® szkripttel, valamint a sort és uniq parancsokkal készítsünk gyako-riságeloszlást, és az adatokat mentsük el egy fájl-ba. gnuplottal ábrázoljuk az adatokat és illesszünk az adatokra normális eloszlást:
N(m, σ) = 1
√2πσe−
(x−m)2
2σ2 (11.1)
4. Ismételjük meg az el®z® feladatot T = 5,10,20,50,100,200,500,1000 id®lé-pésre, és írjuk be az illesztett paramétereket egy adatfájlba.
5. Ábrázoljuk az illesztett paramétereket a T függvényében. Mit tapasztalunk?
Próbáljunk meg az adatokra hatványfüggvényt illeszteni, és határozzuk meg
6. Írjunk LATEX jegyz®könyvet Piszkos Fred bolyongásáról!
F11.2. Piszkos Fred újra felöntött a garatra az Origó nev¶ kocsmában. Igen ám, de a múlt alkalom óta fejlesztették az ivó környékét. Piszkos Fred az utóbbi id®ben már a síkon bármerre botorkálhat. Készítsük el a szimulátort, amivel a trajektóriáját lehet nyomon követni. Vizsgáljuk meg a következ® kérdéseket, amir®l ábrákkal tarkított jegyz®könyvet készítünk.
1. N lépés után Piszkos Fred elpihen egy arra alkalmas helyen, mondjuk egy árokban. Hol vannak a gödrök, azaz hogyan alakul Piszkos Fred kocsmától számított távolságának eloszlása?
2. Hogyan változikN-nel ez az eloszlás?
3. Bolyongása során Piszkos Fred néha visszatér egy-egy pohárkára, amikor az ivó sugarába kerül. Mekkora ennek a valószín¶sége? Valamint a visszatéré-sek között megtett utak hossza milyen eloszlást követ?
4. Milyen érdekes kérdést tehetünk még fel Piszkos Fred botorkálásával kapcso-latban?
F11.3. Dr. Watson a Balaton-parton üldögél, amikor a víz egy palackot sodor a partra.
A palackban a következ® üzenetet találja:
RGKKTRJLFKVJABXVVNAXALGJASTMLGMTMFEKVKZFKEKVKZFKGRAZGXOTMXVG
RZOGHYGJOVHYVSRFGKVKZNGMGRZFVIIAKVKFEZGRFRAIAKVJFZAZZMVZEKOA EZABVOGHYGJOGHEKAMFZAOLGMGJVSAMAJIVKVXFEKGOGEFZZGHYDETRYVEKA JAXGZJGKFJOVEPGMBVGROVHYVSAJZGOVHYVSEKAOVHYVSFJOGSZFJGEMGEKV KFHGIGZDFXFMFKVMZRYGMXGRRASXGHTMHASAHTMLAMHVSTMLVEKJRYGMXGRE ZLVKZNGMGRZFOVNBSAPAHAEJVDEVETMZGZGEKGOGEKGMGEKFJFBGFTLASJVE VMVZVXVMOFJAKLGRYGITBFOGRTIFRVDEVJGHYJFEMVRYZITKKVVCTMGOLGZA XVLLVVRYTJVOGIGZGJOVHYVSRFOVHYVSIVZEKMGZZTMVKZNGMGRZFIAHYGHY JFECFTGMJGSGBKJGBFJOAKFLVEVKGBGEVRYNVRGOFIVLAKVETZVRGMGRHGBF PGBFHVCFMOGZDEVJZFKGRRYAMDGXGRCGMTMFGJMVZAHVZIVZNVJBGIVHYNTJ VJTMCAMBGZFZZIARFEEAJOFRBGRZOVEJGRZIFXRVJOVNBPGMBVTMVXVRFMFV IGMYGZZOGMYFBGHGREKAVIVLASTOGHYVZVJAKZTBVZLVOFRZIAHYSGHFNGMG RZGEGZVOTHYFEGMXGEKZGZZGVXFEGHSVBFDTJSVEKBVLVRZGIVZVCVHYMVMZ AEPTMZCAMAZZGKMGEKJFFSXVGPGSPTRDEIVLASTDEAJAMVBGFHYCAHTRJGMR FVBBFHGKZVPVSGXGZJFJGMMLFSRF
A jelek szerint a szöveget bet¶helyettesítéses titkosítással kódolták, és magyarul íródott. Segítsünk Watsonnak megfejteni az írást!
A megfejtésr®l készítsünk egy LATEX dokumentumot, mely tartalmazza a megfej-tést, valamint a megfejtéshez írt programot.
(Útmutatás: A gyakorlaton megismert Unix parancsok segítségével a titkosított szöveg bet¶ir®l készítsünk egy gyakoriság eloszlást, és hasonlítsuk össze a11.1. áb-rán látható eloszlással, mely egy tipikus magyar nyelv¶ szövegb®l készült.
A titkosítás visszafejtését kezdjük a leggyakoribb bet¶kkel. A tr paranccsal a megfejtett bet¶k helyére helyettesítsünk kis bet¶ket. Ennek segítségével a részben megfejtett szöveg egyes részeib®l újabb bet¶kre következtethetünk.)
11.1. ábra. Bet¶k gyakoriság eloszlása magyar szövegben.
12. fejezet Megoldások
Ebben a fejezetben összegy¶jtöttük a gyakorló példák megoldásához szükséges legfonto-sabb lépéseket.
12.1. Az 1. fejezet gyakorló feladatainak megoldásai
M1.1. megoldás: A nem annyira billenty¶takarékos megoldás a következ®:
lljllklljjjhhhhhjjlllllllkkkkklljjllkklljllklljjjhhh hjhhhhjjjhhhhhhhhhjjlllllllllllkkkllllklljjjjhhkhhjj
Megjegyezzük, hogy az alábbi rövidebb parancssorozat is végigvezet a labirintuson:
lljllkll3j4hhjj7l5klljjllkklljllkl l3j4hj4h3j9hjj11l3k4lkll4jhhkhhjj
M1.2. megoldás: Egy lehetséges megoldás a következ®képpen kezd®dik:
Mit? Miért?
to Jobbra visszük a kurzort (t) az els® o karakterig.
5l A kurzorral 5 karakterrel jobbra (l) ugrunk.
to Ismét jobbra visszük a kurzort az els® o-ig.
jjjjj Ötször lefelé (j) visszük a kurzort.
To Balra visszük a kurzort (T) az els® o-ig.
... ...
Egy teljes megoldás a következ®:
to5ltojjjjjTojjhh4jhhjhhhjhjjljllll9lt okkkklklll3ktokktoklkto6jhjjjj3jjljljl
M1.3. megoldás: Az alábbi táblázat mutat egy megoldást:
Mit? Miért?
ihétf® Insert módba kapcsolunk és begépeljük az els® napot.
<Enter> Új sort kezdünk.
kedd Begépeljük a második napot.
... ...
vasárnap Begépeljük az utolsó napot.
<Esc> Kilépünk az Insert módból.
3k A kurzort 3 sorral feljebb visszük csütörtök-re.
dd A csütörtök-öt kitöröljük, ami így bekerül egy ideiglenes regiszterbe.
A kurzor a következ® sorra (péntek) ugrik.
3k A kurzort 3 sorral feljebb visszük.
P Az ideiglenes regiszter tartalmát visszamásoljuk hétf® fölé (P).
3j A kurzort 3 sorral lejjebb visszük.
dd A szerdá-t kitöröljük, ami így bekerül egy ideiglenes regiszterbe. A kurzor a következ® sorra (péntek) ugrik.
p Az ideiglenes regiszter tartalmát visszamásoljuk péntek alá (p).
A megoldásmenet kezdeti fázisai az alábbi ábrán láthatók, ahol a segédkeret mu-tatja a kurzor helyét az egyes m¶veletek el®tt és után.
hétf® M1.4. megoldás: Az alábbi táblázat mutat egy megoldást:
Mit? Miért?
yy Bemásoljuk a címet tartalmazó sort egy ideiglenes regiszterbe
p Visszamásoljuk az ideiglenes regiszter tartalmát a szövegbe, a cím alá.
A kurzor automatikusan a bemásolt cím els® nem üres karakterére ug-v rik.Visual módba kapcsolunk.
$ A cím utolsó karakterére ugrunk.
r- A kijelölt karakterek cseréje a - karakterre
Mit? Miért?
"ayw Az a regiszterbe ("a) bemásoljuk az els® szót (dw).
"byw Az b regiszterbe ("b) bemásoljuk a második szót (dw).
... ...
"fyw Az f regiszterbe ("f) bemásoljuk a hatodik szót (dw).
3G A 3. sorra ugrunk.
W A következ® SZÓRA1ugrunk.
"aP Az a regiszter tartalmát ("a) beszúrjuk a kurzor elé (P).
dt, Kitöröljük (d) a karaktereket a vessz®ig jobbra (t,).
W A következ® SZÓRA ugrunk.
"bP Az b regiszter tartalmát ("b) beszúrjuk a kurzor elé (P).
dt, Kitöröljük (d) a karaktereket a vessz®ig jobbra (t,).
... ...
M1.6. megoldás: Az alábbi táblázat egy lehetséges megoldást mutat be:
Mit? Miért?
qa A makró rögzítésének indítása az a regiszterbe.
0 A sor elejére ugrunk.
x A kurzor alatti karaktert kitöröljük, és bemásoljuk az ideiglenes regisz-terbe.
$ A sor végére ugrunk.
p Az ideiglenes regiszterb®l a sor végére másoljuk a karaktert.
q A makró rögzítésének befejezése.
A makrót a @a billenty¶k leütésével indíthatjuk. A makró egymás utáni alkalma-zásával körbeforgathatjuk a sort. Próbáljuk ki!