Dacă intenționați să combinați informații din două fișiere text, identificând un element comun, comanda join din Linux este ideală. Aceasta aduce un plus de flexibilitate prelucrării datelor statice. În acest ghid, vă vom explica cum să o utilizați eficient.
Corelarea Datelor Între Fișiere
Datele sunt fundamentale în lumea modernă. Companiile, afacerile de toate dimensiunile și chiar și gospodăriile depind de ele. Gestionarea datelor stocate în fișiere separate, adunate din diverse surse, poate fi dificilă. Pe lângă identificarea fișierelor relevante, este posibil ca acestea să aibă formate și structuri diferite.
În plus, apar probleme administrative legate de actualizarea, backup-ul și arhivarea corectă a fișierelor. Dacă doriți să consolidați datele sau să realizați analize pe un set extins de date, complexitatea crește. Cum unificați informațiile din fișiere variate înainte de a le putea folosi în scopul dorit? Cum abordați etapa de pregătire a datelor?
Vestea bună este că, dacă fișierele au cel puțin un câmp comun, comanda join din Linux vă poate simplifica considerabil procesul.
Exemplu de Fișiere de Date
Pentru a demonstra funcționalitățile comenzii join, vom folosi date fictive, organizate în două fișiere distincte:
cat file-1.txt
cat file-2.txt
Conținutul fișierului file-1.txt este următorul:
1 Adore Varian [email protected] Female 192.57.150.231 2 Nancee Merrell [email protected] Female 22.198.121.181 3 Herta Friett [email protected] Female 33.167.32.89 4 Torie Venmore [email protected] Female 251.9.204.115 5 Deni Sealeaf [email protected] Female 210.53.81.212 6 Fidel Bezley [email protected] Male 72.173.218.75 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 8 Odell Jursch [email protected] Male 1.138.85.117
Acest fișier conține linii numerotate, fiecare detaliind:
- Un număr
- Un prenume
- Un nume de familie
- O adresă de email
- Sexul persoanei
- O adresă IP
Conținutul fișierului file-2.txt este următorul:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93 8 Jursch [email protected] Male Hudson Valley $663,821.09
Fiecare linie din file-2.txt conține informații despre:
- Un număr
- Un nume de familie
- O adresă de email
- Sexul persoanei
- O regiune din New York
- O valoare financiară
Comanda join funcționează pe baza unor „câmpuri”, definite ca secțiuni de text separate prin spații albe, începutul sau sfârșitul unei linii. Pentru a potrivi liniile între două fișiere, fiecare linie trebuie să includă un câmp comun.
Câmpul de potrivire trebuie să fie prezent în ambele fișiere. De exemplu, adresa IP apare doar în file-1.txt, iar prenumele doar în file-1.txt, deci nu le putem folosi. Deși numele de familie este comun, folosirea lui ar fi riscantă, deoarece mai multe persoane ar putea avea același nume.
Nu putem utiliza nici câmpul „sex”, deoarece este prea general. Regiunile din New York și valorile financiare sunt, de asemenea, specifice unui singur fișier.
Totuși, adresa de email este unică și prezentă în ambele fișiere, fiind o opțiune viabilă. O verificare rapidă confirmă că liniile corespund aceleiași persoane, deci putem folosi numerele de linie ca bază pentru potrivire (vom explora o altă variantă mai târziu).
Este important de reținut că cele două fișiere au un număr diferit de câmpuri, ceea ce este normal. Comanda join permite specificarea câmpului de potrivire din fiecare fișier.
Trebuie să fim atenți la câmpuri precum regiunile din New York; într-un fișier unde câmpurile sunt separate prin spațiu, fiecare cuvânt al denumirii unei regiuni este considerat un câmp. Deoarece unele regiuni au denumiri formate din două sau trei cuvinte, numărul de câmpuri variază în cadrul fișierului. Acest aspect nu este problematic, atâta timp cât potrivim câmpurile care preced informațiile despre regiunile din New York.
Sintaxa Comenzii join
Înainte de a folosi join, câmpul pe baza căruia se face potrivirea trebuie să fie sortat. În cazul nostru, avem numere crescătoare în ambele fișiere, deci îndeplinim acest criteriu. Implicit, join folosește primul câmp din fiecare fișier, ceea ce este exact ceea ce ne dorim. De asemenea, join presupune că separatorul de câmpuri este un spațiu alb, lucru care se aplică și în cazul nostru. Prin urmare, putem rula comanda imediat.
Pentru a folosi setările implicite, comanda este simplă:
join file-1.txt file-2.txt

Comanda join consideră fișierele în ordinea specificată, adică „fișierul unu” și „fișierul doi”.
Rezultatul este următorul:
1 Adore Varian [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73 2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10 3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44 4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02 5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15 6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93 8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09
Ieșirea este structurată astfel: mai întâi se afișează câmpul de potrivire, urmat de restul câmpurilor din fișierul unu și apoi câmpurile din fișierul doi, exceptând câmpul de potrivire.
Fișiere Nesortate
Să testăm ce se întâmplă când datele nu sunt sortate corect. Vom modifica un fișier astfel încât comanda join să nu poată funcționa corect. Conținutul file-3.txt este identic cu file-2.txt, dar linia opt este mutată între liniile cinci și șase.
Conținutul fișierului file-3.txt este următorul:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 8 Jursch [email protected] Male Hudson Valley $663,821.09 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93
Vom încerca să unim file-3.txt cu file-1.txt:
join file-1.txt file-3.txt

Comanda join indică faptul că linia a șaptea din file-3.txt nu este în ordine, deci nu este procesată. Aceasta este linia care începe cu numărul șase, care ar trebui să fie înaintea lui opt într-o listă sortată. Linia a șasea din fișier (care începe cu „8 Odell”) a fost ultima procesată, deci vedem rezultatul acesteia.
Opțiunea --check-order poate fi folosită pentru a verifica dacă ordinea de sortare a fișierelor este corectă, fără a încerca îmbinarea.
Pentru a face acest lucru, introducem:
join --check-order file-1.txt file-3.txt

Comanda join ne avertizează că există o problemă cu linia a șaptea din fișierul file-3.txt.
Fișiere cu Linii Lipsă
În file-4.txt, ultima linie a fost ștearsă, deci nu există o linie opt. Conținutul său este următorul:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93
Introducem următoarea comandă, iar join procesează liniile disponibile, fără a genera erori:
join file-1.txt file-4.txt

Rezultatul afișează șapte linii îmbinate.
Opțiunea -a (print unpairable) permite comenzii join să afișeze și liniile care nu au fost potrivite.
Introducem următoarea comandă pentru a afișa liniile din file-1.txt care nu au corespondent în file-4.txt:
join -a 1 file-1.txt file-4.txt

Șapte linii au fost potrivite, iar linia a opta din file-1.txt este afișată ca nepotrivită. Nu sunt afișate informații din al doilea fișier, deoarece nu exista o linie opt în file-4.txt. Totuși, linia este prezentă în rezultat, indicând lipsa corespondentului în file-4.txt.
Comanda -v (suprimă liniile unite) dezvăluie liniile care nu au o potrivire:
join -v file-1.txt file-4.txt

Vedem că linia a opta este singura care nu are un corespondent în al doilea fișier.
Potrivirea După Alte Câmpuri
Să unim două fișiere noi, folosind un câmp diferit de cel implicit (câmpul unu). Conținutul file-7.txt este:
[email protected] Female 192.57.150.231 [email protected] Female 210.53.81.212 [email protected] Male 72.173.218.75 [email protected] Female 33.167.32.89 [email protected] Female 22.198.121.181 [email protected] Male 1.138.85.117 [email protected] Female 251.9.204.115 [email protected] Female 4.204.0.237
Conținutul lui file-8.txt este următorul:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93
Singurul câmp comun este adresa de email, care este câmpul unu în primul fișier și câmpul doi în al doilea. Opțiunile -1 (câmpul din fișierul unu) și -2 (câmpul din fișierul doi) permit specificarea acestor câmpuri. Le vom urma cu numărul corespunzător câmpului din fiecare fișier.
Introducem următoarea comandă pentru a utiliza primul câmp din file-7.txt și al doilea din file-8.txt:
join -1 1 -2 2 file-7.txt file-8.txt

Fișierele sunt unite pe baza adresei de email, afișată ca primul câmp al fiecărei linii din rezultat.
Separatoare de Câmp Diferite
Ce se întâmplă când fișierele folosesc separatoare de câmp diferite de spații albe?
Următoarele două fișiere folosesc virgule ca separatoare, iar singurele spații albe sunt între numele de locuri formate din mai multe cuvinte:
cat file-5.txt
cat file-6.txt

Putem folosi opțiunea -t (caracterul separator) pentru a specifica ce caracter să folosească join ca separator. În acest caz, este virgula. Introducem următoarea comandă:
join -t, file-5.txt file-6.txt

Toate liniile sunt potrivite, iar spațiile din numele de locuri sunt păstrate.
Ignorarea Majusculelor
Fișierul file-9.txt este aproape identic cu file-8.txt. Singura diferență este că unele adrese de email conțin majuscule, după cum urmează:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93
Când am unit file-7.txt cu file-8.txt, totul a funcționat perfect. Să vedem ce se întâmplă cu file-7.txt și file-9.txt.
Introducem următoarea comandă:
join -1 1 -2 2 file-7.txt file-9.txt

Am potrivit doar șase linii. Diferențele dintre majuscule și minuscule au împiedicat unirea celorlalte două adrese de email.
Putem folosi opțiunea -i (ignora majuscule) pentru a permite comenzii join să ignore aceste diferențe și să potrivească câmpurile indiferent de utilizarea majusculelor.
Introducem următoarea comandă:
join -1 1 -2 2 -i file-7.txt file-9.txt

Toate cele opt linii au fost potrivite și îmbinate cu succes.
Concluzii
Comanda join este un instrument valoros pentru pregătirea datelor. Indiferent dacă doriți să analizați date sau să le pregătiți pentru importul într-un alt sistem, această comandă vă va fi de mare ajutor.
Indiferent de situație, veți fi mulțumit că ați ales să folosiți join!