Cum să utilizați comanda join pe Linux

Dacă doriți să îmbinați datele din două fișiere text prin potrivirea unui câmp comun, puteți utiliza comanda Linux join. Adaugă o strop de dinamism fișierelor dvs. de date statice. Vă vom arăta cum să-l utilizați.

Potrivirea datelor între fișiere

Datele sunt regele. Corporațiile, întreprinderile și gospodăriile deopotrivă funcționează pe el. Dar datele stocate în fișiere diferite și adunate de diferiți oameni sunt dureroase. Pe lângă faptul că știți ce fișiere să deschideți pentru a găsi informațiile dorite, este posibil ca aspectul și formatul fișierelor să fie diferite.

De asemenea, trebuie să vă confruntați cu durerea de cap administrativă a căror fișiere trebuie actualizate, care trebuie să facă backup, care sunt moștenire și care pot fi arhivate.

În plus, dacă trebuie să vă consolidați datele sau să efectuați o analiză într-un întreg set de date, aveți o problemă suplimentară. Cum raționalizați datele din diferite fișiere înainte de a putea face ceea ce trebuie să faceți cu ele? Cum abordați faza de pregătire a datelor?

Vestea bună este că dacă fișierele partajează cel puțin un element de date comun, comanda Linux join te poate scoate din mocirlă.

Fișierele de date

Toate datele pe care le vom folosi pentru a demonstra utilizarea comenzii join sunt fictive, începând cu următoarele două fișiere:

cat file-1.txt
cat file-2.txt

Conținutul de

Următorul este conținutul fișierului-1.txt:

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

Avem un set de linii numerotate și fiecare linie conține toate următoarele informații:

Un număr
Un prenume
Un nume de familie
O adresă de e-mail
Sexul persoanei
O adresă IP

Următorul este conținutul fișierului-2.txt:

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 următoarele informații:

Un număr
Un nume de familie
O adresă de e-mail
Sexul persoanei
O regiune din New York
Valoarea unui dolar

Comanda join funcționează cu „câmpuri”, care, în acest context, înseamnă o secțiune de text înconjurată de spații albe, începutul unei linii sau sfârșitul unei linii. Pentru ca join să se potrivească liniile dintre cele două fișiere, fiecare linie trebuie să conțină un câmp comun.

  Cum să răsfoiți Reddit de pe desktopul Linux cu Giara

Prin urmare, putem potrivi un câmp doar dacă acesta apare în ambele fișiere. Adresa IP apare doar într-un singur fișier, așa că nu este bine. Prenumele apare doar într-un singur fișier, așa că nici nu îl putem folosi. Numele de familie este în ambele dosare, dar ar fi o alegere proastă, deoarece persoane diferite au același nume de familie.

Nu puteți lega datele împreună cu intrările masculine și feminine, deoarece sunt prea vagi. Regiunile din New York și valorile dolarului apar doar într-un singur fișier.

Cu toate acestea, putem folosi adresa de e-mail deoarece este prezentă în ambele fișiere și fiecare este unic pentru o persoană. O privire rapidă prin fișiere confirmă, de asemenea, că liniile din fiecare corespund aceleiași persoane, astfel încât să putem folosi numerele de linie ca câmp pentru a se potrivi (vom folosi un câmp diferit mai târziu).

Rețineți că există un număr diferit de câmpuri în cele două fișiere, ceea ce este în regulă – putem spune join ce câmp să folosim din fiecare fișier.

Cu toate acestea, ai grijă la câmpuri precum regiunile din New York; într-un fișier separat prin spațiu, fiecare cuvânt din numele unei regiuni arată ca un câmp. Deoarece unele regiuni au nume de două sau trei cuvinte, aveți de fapt un număr diferit de câmpuri în același fișier. Este în regulă, atâta timp cât potriviți câmpurile care apar în linia înaintea regiunilor New York.

Comanda de unire

În primul rând, câmpul pe care urmează să-l potriviți trebuie să fie sortat. Avem numere crescătoare în ambele fișiere, așa că îndeplinim aceste criterii. În mod implicit, join folosește primul câmp dintr-un fișier, ceea ce ne dorim. O altă valoare implicită sensibilă este aceea că join se așteaptă ca separatorii de câmpuri să fie spații albe. Din nou, avem asta, așa că putem merge înainte și lansăm alăturarea.

Deoarece folosim toate setările implicite, comanda noastră este simplă:

join file-1.txt file-2.txt

The

join consideră că fișierele sunt „fișierul unu” și „fișierul doi” în conformitate cu ordinea în care sunt listate pe linia de comandă.

Ieșirea este după cum urmează:

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 formatată în felul următor: câmpul în care s-au potrivit liniile este imprimat mai întâi, urmat de celelalte câmpuri din fișierul unu și apoi câmpurile din fișierul doi fără câmpul de potrivire.

  Cum să utilizați comanda dig pe Linux

Câmpuri nesortate

Să încercăm ceva ce știm că nu va funcționa. Vom pune liniile dintr-un singur fișier din ordine, astfel încât join nu va putea procesa fișierul corect. Conținutul fișierului-3.txt este același cu fișierul-2.txt, dar linia opt este între rândurile cinci și șase.

Următorul este conținutul fișierului-3.txt:

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

Introducem următoarea comandă pentru a încerca să vă alăturați fișierului-3.txtto fișier-1.txt:

join file-1.txt file-3.txt

The

join raportează că a șaptea linie din fișierul-3.txt nu este în ordine, deci nu este procesată. Linia șapte este cea care începe cu numărul șase, care ar trebui să apară înainte de opt într-o listă sortată corect. A șasea linie din fișier (care începe cu „8 Odell”) a fost ultima procesată, așa că vedem rezultatul acestuia.

Puteți utiliza opțiunea –check-order dacă doriți să vedeți dacă alăturarea este mulțumită de ordinea de sortare a fișierelor – nu se va încerca îmbinare.

Pentru a face acest lucru, introducem următoarele:

join --check-order file-1.txt file-3.txt

The

join vă spune în avans că va fi o problemă cu linia șapte a fișierului fișier-3.txt.

Fișiere cu linii lipsă

În fișierul-4.txt, ultima linie a fost eliminată, așa că nu există o linie opt. Conținutul este după cum urmează:

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ătoarele și, în mod surprinzător, join nu se plânge și procesează toate rândurile pe care le poate:

join file-1.txt file-4.txt

The

Ieșirea listează șapte linii îmbinate.

Opțiunea -a (print unpairable) îi spune join să imprime și liniile care nu au putut fi potrivite.

Aici, tastăm următoarea comandă pentru a spune join să imprime liniile din fișierul unu care nu pot fi asociate cu liniile din fișierul doi:

join -a 1 file-1.txt file-4.txt

The

Șapte linii sunt potrivite, iar linia opt din fișierul unu este tipărită, nepotrivită. Nu există nicio informație îmbinată deoarece fișierul-4.txt nu conținea o linie opt cu care să poată fi asociată. Cu toate acestea, cel puțin încă apare în rezultat, astfel încât să știți că nu are o potrivire în fișierul-4.txt.

Introducem următoarea comandă -v (suprimă liniile unite) pentru a dezvălui orice linii care nu au o potrivire:

join -v file-1.txt file-4.txt

The

Vedem că linia opt este singura care nu are o potrivire în fișierul doi.

  Cum să utilizați comanda dmesg pe Linux

Potrivirea altor câmpuri

Să potrivim două fișiere noi într-un câmp care nu este implicit (câmpul unu). Următorul este conținutul fișierului-7.txt:

[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

Și următorul este conținutul fișierului-8.txt:

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 sensibil de utilizat pentru aderare este adresa de e-mail, care este câmpul unu în primul fișier și câmpul doi în al doilea. Pentru a face acest lucru, putem folosi opțiunile -1 (fișier un câmp) și -2 (fișier doi câmp). Le vom urma cu un număr care indică ce câmp din fiecare fișier ar trebui utilizat pentru aderare.

Introducem următoarele pentru a spune join să folosească primul câmp din fișierul unu și al doilea din fișierul doi:

join -1 1 -2 2 file-7.txt file-8.txt

The

Fișierele sunt unite pe adresa de e-mail, care este afișată ca primul câmp al fiecărei linii din ieșire.

Utilizarea diferitelor separatoare de câmp

Ce se întâmplă dacă aveți fișiere cu câmpuri care sunt separate prin altceva decât spații albe?

Următoarele două fișiere sunt delimitate prin virgulă — singurul spațiu alb este între numele de locuri cu mai multe cuvinte:

cat file-5.txt
cat file-6.txt

Conținutul de

Putem folosi -t (caracterul separator) pentru a spune join ce caracter să folosim ca separator de câmp. În acest caz, este virgula, așa că introducem următoarea comandă:

join -t, file-5.txt file-6.txt

The

Toate liniile sunt potrivite, iar spațiile sunt păstrate în numele locurilor.

Ignorarea literei majuscule

Un alt fișier, fișierul-9.txt, este aproape identic cu fișierul-8.txt. Singura diferență este că unele adrese de e-mail au majuscule, după cum se arată mai jos:

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 ne-am alăturat fișierului-7.txt și fișierului-8.txt, a funcționat perfect. Să vedem ce se întâmplă cu fișierul-7.txt și fișierul-9.txt.

Introducem următoarea comandă:

join -1 1 -2 2 file-7.txt file-9.txt

The

Am potrivit doar șase rânduri. Diferențele dintre litere mari și mici au împiedicat unirea celorlalte două adrese de e-mail.

Cu toate acestea, putem folosi opțiunea -i (ignora majuscule) pentru a forța unirea să ignore acele diferențe și să potriviți câmpurile care conțin același text, indiferent de majuscule.

Introducem următoarea comandă:

join -1 1 -2 2 -i file-7.txt file-9.txt

The

Toate cele opt linii sunt potrivite și îmbinate cu succes.

Se amestecă și se potrivesc

În alăturare, ai un aliat puternic atunci când te lupți cu pregătirea incomodă a datelor. Poate că trebuie să analizați datele sau poate că încercați să le puneți în formă pentru a efectua un import într-un alt sistem.

Indiferent care este situația, te vei bucura că te-ai alăturat colțului tău!