Szövegfájlok egyesítésének és rendezésének számos módja van Linuxon, de az, hogy hogyan kell ezt megtenni, attól függ, hogy mit akarsz elérni – akár egyszerűen több fájl tartalmát akarod egy nagy fájlba helyezni, akár úgy akarod rendezni, hogy könnyebben használható legyen. Ebben a bejegyzésben megnézünk néhány parancsot a fájlok tartalmának rendezésére és összevonására, és arra összpontosítunk, hogy az eredmények hogyan különböznek egymástól.
A cat használata
Ha csak egy fájlcsoportot szeretne egyetlen fájlba összevonni, a cat parancs könnyű választás. Mindössze annyit kell tennie, hogy beírja a “cat” parancsot, majd a parancssoron felsorolja a fájlokat abban a sorrendben, ahogyan azokat az egyesített fájlban szerepeltetni szeretné. A parancs kimenetét irányítsa át a létrehozni kívánt fájlba. Ha a megadott nevű fájl már létezik, azt felülírja a létrehozandó fájl. Például:
$ cat firstfile secondfile thirdfile > newfile
Ha egy fájlsorozat tartalmát szeretné hozzáadni egy meglévő fájlhoz, ahelyett, hogy felülírná azt, csak módosítsa a >-t >>-re.
$ cat firstfile secondfile thirdfile >> updated_file
Ha az egyesítendő fájlok valamilyen kényelmes elnevezési konvenciót követnek, a feladat még egyszerűbb lehet. Nem kell az összes fájlnevet felvennie, ha azokat egy reguláris kifejezéssel adhatja meg. Ha például a fájlok mindegyike a “file” szóra végződik, mint a fenti példában, akkor valami ilyesmit tehet:
$ cat *file > allfiles
Megjegyezzük, hogy a fenti parancs a fájlok tartalmát alfanumerikus sorrendben adja össze. Linuxon a “filea” nevű fájl a “fileA” nevű fájl előtt, de a “file7” nevű fájl után kerülne hozzáadásra. Végül is nem csak “ABCDE”-re kell gondolnunk, amikor egy alfanumerikus sorrendről van szó, hanem “0123456789aAbBcCdDeE”-re is. Mindig használhatsz egy olyan parancsot, mint az “ls *file”, hogy megnézd a fájlok sorrendjét, mielőtt összevonod a fájlokat.
MEGJEGYZÉS: Jó ötlet először meggyőződni arról, hogy a parancsod tartalmazza az összes olyan fájlt, amelyet az összevont fájlban akarsz látni, és nem másokat – különösen, ha olyan jokert használsz, mint a “*”. És ne feledje, hogy az egyesített fájlok továbbra is különálló fájlokként fognak létezni, amelyeket az egyesítés ellenőrzése után esetleg törölni szeretne.
Fájlok egyesítése kor szerint
Ha nem a fájlnevek, hanem az egyes fájlok kora alapján szeretné egyesíteni a fájlokat, használjon egy ehhez hasonló parancsot:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
A -tr opció (t=time, r=reverse) használatával a fájlok listáját a legidősebb-első kor szerinti sorrendben kapja. Ez hasznos lehet például akkor, ha bizonyos tevékenységekről naplót vezet, és azt szeretné, hogy a tartalom a tevékenységek elvégzésének sorrendjében kerüljön hozzá.
A fenti parancsban szereplő $$ a parancs futtatásakor a folyamat azonosítóját jelenti. Teljesen felesleges ezt használni, de szinte lehetetlenné teszi, hogy véletlenül egy meglévő fájl végére adjon hozzá, ahelyett, hogy újat hozna létre. Ha a $$-t használja, az eredményül kapott fájl így nézhet ki:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Fájlok egyesítése és rendezése
A Linux néhány érdekes lehetőséget biztosít a fájlok tartalmának rendezésére az egyesítés előtt vagy után.
Tartalom rendezése ábécé szerint
Ha azt szeretné, hogy az egyesített fájlok tartalma rendezett legyen, akkor a teljes tartalmat egy ilyen paranccsal rendezheti:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Ha a tartalmat fájlonként csoportosítva szeretné tartani, akkor az egyes fájlokat az új fájlhoz való hozzáadás előtt rendezze az egyes fájlokat egy ilyen paranccsal:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Fájlok numerikus rendezése
A fájlok tartalmának numerikus rendezéséhez használja a -n kapcsolót a sort kapcsolóval. Ez az opció csak akkor hasznos, ha a fájlok sorai számokkal kezdődnek. Ne feledje, hogy az alapértelmezett sorrendben a “02” kisebbnek számítana, mint az “1”. A -n opciót akkor használja, ha biztosítani szeretné, hogy a sorok numerikus sorrendben legyenek rendezve.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
A -n opcióval a fájlok tartalmát dátum szerint is rendezheti, ha a fájlok sorai olyan formátumú dátumokkal kezdődnek, mint “2020-11-03” vagy “2020/11/03” (év, hónap, nap formátum). A más formátumú dátumok szerinti rendezés trükkös lesz, és sokkal összetettebb parancsokat igényel.
A beillesztés használata
A beillesztés parancs lehetővé teszi, hogy a fájlok tartalmát soronként egyesítse. Ha ezt a parancsot használja, az egyesített fájl első sora tartalmazza az egyesített fájlok első sorát. Íme egy példa, amelyben nagybetűket használtam, hogy könnyen látható legyen, honnan származnak a sorok:
$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five
A kimenet átirányítása egy másik fájlba a mentéshez:
$ paste file.a file.b file.c > merged_content
Változatlanul úgy is összeilleszthet fájlokat, hogy az egyes fájlok tartalma egyetlen sorban egyesül. Ehhez a -s (szekvenciális) opció használata szükséges. Figyelje meg, hogy a kimenet ezúttal az egyes fájlok tartalmát mutatja:
$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five
A join
A fájlok összevonására szolgáló másik parancs a join. A join parancs lehetővé teszi több fájl tartalmának összevonását egy közös mező alapján. Például lehet, hogy van egy fájl, amely munkatársak egy csoportjának telefonszámait tartalmazza, és egy másik, amely a munkatársak személyes e-mail címeit tartalmazza, és mindkettő az egyének neve alapján van felsorolva. Az egyesítéssel létrehozhat egy olyan fájlt, amely mind a telefonszámokat, mind az e-mail címeket tartalmazza.
Egy fontos korlátozás, hogy a fájlok sorainak azonos sorrendben kell szerepelniük, és mindegyik fájlban tartalmazniuk kell az egyesítő mezőt.
Íme egy példaparancs:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
Ebben a példában az első mezőnek (keresztnevek) mindkét fájlban léteznie kell, még akkor is, ha a további információk hiányoznak, különben a parancs hibaüzenetet fog adni. A tartalom rendezése hasznos és valószínűleg sokkal könnyebben kezelhető, de nem szükséges, amíg a sorrend következetes.
Wrap-Up
A Linuxon számos lehetőséged van a különálló fájlokban tárolt adatok összevonására és rendezésére. A választási lehetőségek meglepően egyszerűvé tehetnek néhány egyébként fárasztó feladatot.