Există o serie de modalități de a uni și sorta fișiere text pe Linux, dar modul în care se procedează depinde de ceea ce încercați să realizați – dacă doriți pur și simplu să puneți conținutul mai multor fișiere într-un singur fișier mare sau să îl organizați într-un mod care să faciliteze utilizarea. În această postare, vom examina câteva comenzi pentru sortarea și fuzionarea conținutului fișierelor și ne vom concentra pe modul în care diferă rezultatele.
Utilizarea cat
Dacă tot ce doriți să faceți este să adunați un grup de fișiere într-un singur fișier, comanda cat este o alegere ușoară. Tot ce trebuie să faceți este să tastați „cat” și apoi să enumerați fișierele de pe linia de comandă în ordinea în care doriți să fie incluse în fișierul fuzionat. Redirecționați ieșirea comenzii către fișierul pe care doriți să îl creați. În cazul în care există deja un fișier cu numele specificat, acesta va fi suprascris de cel pe care îl creați. De exemplu:
$ cat firstfile secondfile thirdfile > newfile
Dacă doriți să adăugați conținutul unei serii de fișiere la un fișier existent, în loc să îl suprascrieți, schimbați doar > în >>.
$ cat firstfile secondfile thirdfile >> updated_file
Dacă fișierele pe care le unificați urmează o convenție de denumire convenabilă, sarcina poate fi și mai simplă. Nu va trebui să includeți toate numele fișierelor dacă le puteți specifica folosind o expresie regulată. De exemplu, dacă toate fișierele se termină cu cuvântul „file”, ca în exemplul de mai sus, puteți face ceva de genul acesta:
$ cat *file > allfiles
Rețineți că comanda prezentată mai sus va adăuga conținutul fișierelor în ordine alfanumerică. Pe Linux, un fișier numit „filea” ar fi adăugat înainte de unul numit „fileA”, dar după unul numit „file7”. La urma urmei, nu trebuie să ne gândim doar la „ABCDE” atunci când avem de-a face cu o secvență alfanumerică; trebuie să ne gândim la „0123456789aAbBcCdDeE”. Puteți folosi întotdeauna o comandă precum „ls *fișier” pentru a vedea ordinea în care vor fi adăugate fișierele înainte de a fuziona fișierele.
NOTA: Este o idee bună să vă asigurați mai întâi că comanda dvs. include toate fișierele pe care le doriți în fișierul fuzionat și nu altele – în special atunci când folosiți un wild card precum „*”. Și nu uitați că fișierele fuzionate vor exista în continuare ca fișiere separate, pe care s-ar putea să doriți să le ștergeți după ce fuziunea a fost verificată.
Fuzionarea fișierelor în funcție de vârstă
Dacă doriți să fuzionați fișierele pe baza vârstei fiecărui fișier, mai degrabă decât în funcție de numele fișierelor, utilizați o comandă ca aceasta:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Utilizarea opțiunilor -tr (t=time, r=reverse) va avea ca rezultat o listă de fișiere în ordinea vârstei cel mai vechi – primul. Acest lucru poate fi util, de exemplu, dacă păstrați un jurnal al anumitor activități și doriți ca conținutul să fie adăugat în ordinea în care au fost efectuate activitățile.
$ din comanda de mai sus reprezintă ID-ul de proces pentru comandă atunci când o rulați. Este complet inutil să folosiți acest lucru, dar face aproape imposibil să adăugați din greșeală la sfârșitul unui fișier existent în loc să creați unul nou. Dacă folosiți $$, fișierul rezultat ar putea arăta astfel:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Funcționarea și sortarea fișierelor
Linux oferă câteva modalități interesante de a sorta conținutul fișierelor înainte sau după fuziune.
Sortarea conținutului în ordine alfabetică
Dacă doriți ca conținutul fișierului fuzionat să fie sortat, puteți sorta conținutul general cu o comandă ca aceasta:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Dacă doriți să păstrați conținutul grupat pe fișiere, sortați fiecare fișier înainte de a-l adăuga la noul fișier cu o comandă ca aceasta:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Sortarea numerică a fișierelor
Pentru a sorta conținutul fișierelor numeric, utilizați opțiunea -n cu sort. Această opțiune este utilă numai dacă liniile din fișierele dumneavoastră încep cu numere. Rețineți că, în ordinea implicită, „02” ar fi considerat mai mic decât „1”. Utilizați opțiunea -n atunci când doriți să vă asigurați că liniile sunt sortate în ordine numerică.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
Opțiunea -n vă permite, de asemenea, să sortați conținutul fișierelor în funcție de dată, dacă liniile din fișiere încep cu date într-un format precum „2020-11-03” sau „2020/11/03” (format an, lună, zi). Sortarea după date în alte formate va fi complicată și va necesita comenzi mult mai complexe.
Utilizarea comenzii paste
Comanda paste vă permite să uniți conținutul fișierelor linie cu linie. Când utilizați această comandă, prima linie a fișierului unit va conține prima linie a fiecăruia dintre fișierele care se unesc. Iată un exemplu în care am folosit litere majuscule pentru a vedea mai ușor de unde provin liniile:
$ 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
Direcționați ieșirea către un alt fișier pentru a o salva:
$ paste file.a file.b file.c > merged_content
Alternativ, puteți lipi fișierele împreună astfel încât conținutul fiecărui fișier să fie unit pe o singură linie. Acest lucru necesită utilizarea opțiunii -s (secvențial). Observați cum, de data aceasta, ieșirea arată conținutul fiecărui fișier:
$ 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
Utilizarea join
O altă comandă pentru îmbinarea fișierelor este join. Comanda join vă permite să unificați conținutul mai multor fișiere pe baza unui câmp comun. De exemplu, este posibil să aveți un fișier care conține numerele de telefon ale unui grup de colegi de serviciu și un altul care conține adresele de e-mail personale ale acestora și ambele sunt listate după numele persoanelor. Puteți utiliza join pentru a crea un fișier care să conțină atât numerele de telefon, cât și adresele de e-mail.
O restricție importantă este aceea că fișierele trebuie să aibă liniile listate în aceeași ordine și să includă câmpul join în fiecare fișier.
Iată un exemplu de comandă:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
În acest exemplu, primul câmp (prenumele) trebuie să existe în fiecare fișier, chiar dacă informațiile suplimentare lipsesc, altfel comanda va eșua cu o eroare. Sortarea conținutului este utilă și probabil mult mai ușor de gestionat, dar nu este necesară atâta timp cât ordinea este consecventă.
Wrap-Up
Aveți o mulțime de opțiuni pe Linux pentru fuzionarea și sortarea datelor stocate în fișiere separate. Opțiunile pot face ca unele sarcini altfel plictisitoare să fie surprinzător de ușoare.