Állományok rendezése

Állományok rendezésére a standard Unixban egyetlen, ámde igen erőteljes parancs áll rendelkezésre, a sort. Működése kitűnően alkalmas a szabványos Unix szűrési mechanizmus ismertetésére is. Alapvető szintaktikus formája a következő (a részletes opcióleírást lásd a Minimanuál c. fejezetben):

sort [opciók] [bemenet]

Ha bemenet nincs megadva, a standard inputot olvassa és rendezi (ezt explicit módon is megadhatjuk, a - karakterrel). A kimenet alapértelmezés szerint a standard output, a -o kimenet opcióval lehet egy fájlba irányítani a rendezés eredményét. (Érdemes vigyáznunk arra, hogy ha a -o opció megadása nélkül, a sort bemenetének és kimenetének ugyanaz a fájlt adjuk meg, akkor a rendezés tönkreteszi azt; ilyen esetben a -o opció használata kötelező.)

Alapértelmezésben a sort parancs soronként, ASCII karakterérték szerint, növekvő sorrendben, a teljes beolvasott sorokat összehasonlítva rendezi a bemenetet. A -r opció hatására a rendezés sorrendje fordítható meg, a -n opció hatására pedig nem ASCII karakterértékként, hanem számként hasonlítja össze a beolvasott sorokat. (Nemcsak egész, hanem előjeles tizedespontos számokat is tud a sort rendezni.) Például a

ps | sort -n

parancs hatására a futó folyamatokat a processzazonosítók szerintve listázhatjuk ki.

Karakter szerinti rendezésnél fontos lehet a -d opció, ennek alkalmazásával úgynevezett szótári rendezést hajtathatunk végre, ekkor csak a betűk, számjegyek, valamint a szóköz és tabulátor karakterek játszanak a rendezésben. A -f opció hatására a kis- és nagybetűs karaktereket egyformán kezeli a sort, azaz esetérzéketlen rendezést érhetünk el. Meglepően hasznos lehet a -M opció, ennek hatására az összehasonlított mező első három karakterét angol hónapnevek rövidítéseként kezeli a sort, és eszerint rendez (érvénytelen < JAN < FEB < ... < DEC sorrendben).

Eddig nem említettük a sort egyik legfontosabb erényét, miszerint nemcsak a teljes sort összehasonlítva rendezhetjük a bemenetet, hanem azon belül egyes mezőket rendezési kulcsként megadva, kulcsonként, méghozzá több kulcs szerint is. Alapértelmezés szerint a bemenet mezői a szokásos shell értelmezés szerinti önálló, tehát szóköz és tabulátor karakterekkel megadott szavak, de a -tc opcióval tetszőleges más mezőhatároló karaktert is kijelölhetünk.

A rendezési kulcsokat a +m[.n] -p[.q] szintaxissal adhatjuk meg; a + jellel kezdődő opció mondja meg, hogy a rendezési kulcs hol kezdődik, a - karakterrel megadott opció pedig a mező végét. m.n az m-edik mező n-edik karakterét adja meg (a mezőket és karaktereket a sort 0-tól számozza!). A mezőn belüli karaktermegadás elhagyható, ilyenkor értelemszerűen a kulcskezdő mező első, illetve a kulcszáró mező utolsó karakterét jelenti. Hogy kicsit világosabbá tegyük:

sort -n -t: +2 -3 /etc/passwd

hatására a passwd fájl tartalmát a harmadik mező numerikus értéke szerint fogja rendezni, a mezőket pedig a ':' karakter fogja határolni. Más szóval a felhasználói azonosítók értéke szerint rendezve íratjuk ki a fájlt. Ne felejtsük, hogy a sort parancs a mezőket nullától számozza, fő a változatosság alapon...

sort -n -t: +3 -4 -n +2 -3 -o /etc/passwd /etc/passwd

hatására először a password fájl negyedik mezője (felhasználói csoportazonosító) alapján rendez, ha két sor ennek alapján azonos, akkor másodlagos kulcsként a harmadik mező, azaz a felhasználói azonosító alapján rendez - mindkét mező tartalmát numerikus értékként kezelve. A rendezett fájlt visszaírja a /etc/passwd fájlba. Következő példánkban a

sort -n +2.4 my_data

parancs hatására a my_data nevű fájlt rendezzük, a rendezési kulcs pedig a harmadik mező ötödik karakterétől a sor végéig tart. Végül utolsó példánkban olyan adatokat rendezünk sorba, ahol a sorok elején az angol megadás szerinti dátumokat (pl. Aug 23, 1995) várunk:

sort -n +2 -3 -M +0 -1 -n +1 -2

Végül még két fontos opciót említünk meg: a -m hatására két előzetesen már rendezett fájlt fésül össze egybe, a -u pedig a rendezésnél azonosnak talált sorokból csak egyet ír a kimenetre. (Utóbbi esetben érdemes vigyázni, ha ugyanis nem a teljes sor szerint rendezünk, akkor a rendezési kulcs szerinti azonosság nem jelenti azt, hogy a két sor azonos is!)

 

Tartalomjegyzék