Како користити команду придруживања на Линук-у

Ukoliko želite da objedinite podatke iz dva tekstualna fajla, povezujući ih na osnovu zajedničkog polja, komanda `join` u Linux okruženju je idealno rešenje. Ovaj alat dodaje dinamiku vašim statičkim podacima. U nastavku ćemo detaljno objasniti kako se koristi.

Uparivanje podataka iz različitih datoteka

Podaci su od izuzetne važnosti. Korporacije, mala preduzeća i domaćinstva podjednako se oslanjaju na njih. Međutim, podaci koji se čuvaju u različitim datotekama, i koje obrađuju različite osobe, mogu predstavljati problem. Osim što je potrebno znati koje datoteke otvoriti da biste pronašli potrebne informacije, format i raspored datoteka se često razlikuju.

Dodatno, morate se suočiti s administrativnim izazovima, poput toga koje datoteke treba ažurirati, koje treba arhivirati, a koje čuvati kao rezervne kopije.

Ako želite konsolidovati sve svoje podatke ili izvršiti sveobuhvatnu analizu, pojavljuje se još jedan problem. Kako racionalizovati podatke iz različitih datoteka pre nego što ih možete efikasno koristiti? Kako pristupiti pripremi podataka?

Srećom, ukoliko datoteke dele bar jedan zajednički element podataka, Linux komanda `join` vam može pomoći da rešite ovaj problem.

Primeri datoteka sa podacima

Svi podaci koje ćemo koristiti u demonstraciji upotrebe komande `join` su izmišljeni. Počećemo sa sledeće dve datoteke:

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

Sadržaj datoteke `file-1.txt` je sledeći:

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

Svaki red u ovoj datoteci sadrži sledeće informacije:

Redni broj
Ime
Prezime
Email adresa
Pol
IP adresa

Sadržaj datoteke `file-2.txt` je sledeći:

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

Svaki red u datoteci `file-2.txt` sadrži sledeće informacije:

Redni broj
Prezime
Email adresa
Pol
Region u Njujorku
Vrednost u dolarima

Komanda `join` radi sa „poljima“, što u ovom kontekstu znači deo teksta razdvojen razmakom, početkom ili krajem reda. Da bi se redovi iz dve datoteke uparili, svaki red mora sadržati zajedničko polje.

Zato možemo upariti samo polja koja se pojavljuju u obe datoteke. IP adresa se nalazi samo u prvoj datoteci, tako da je ne možemo koristiti. Ime osobe se takođe nalazi samo u prvoj datoteci, te nije odgovarajuće. Prezime je prisutno u obe, ali nije idealan izbor, jer više osoba može imati isto prezime.

Takođe, pol se ne može koristiti za uparivanje, jer nije dovoljno specifičan. Region Njujorka i vrednost u dolarima se nalaze samo u drugoj datoteci.

Međutim, email adresa je idealna, jer se nalazi u obe datoteke i jedinstvena je za svaku osobu. Brzi pregled datoteka takođe potvrđuje da redovi u obe datoteke odgovaraju istoj osobi, tako da možemo koristiti redne brojeve kao polje za uparivanje (kasnije ćemo koristiti drugo polje).

Važno je napomenuti da broj polja u dve datoteke nije isti, što je u redu – možemo odrediti komandi `join` koje polje da koristi iz svake datoteke.

Treba biti oprezan sa poljima poput naziva regiona Njujorka; u datoteci razdvojenoj razmacima, svaka reč u nazivu regiona se tretira kao polje. S obzirom da neki regioni imaju nazive od dve ili tri reči, broj polja u datoteci može varirati. Ovo ne predstavlja problem ukoliko se uparivanje vrši sa poljima koja se pojavljuju pre polja sa nazivom regiona.

Osnovna komanda za spajanje

Pre svega, polja koja se koriste za uparivanje moraju biti sortirana. U našem slučaju, redni brojevi u obe datoteke su u rastućem redosledu, što ispunjava taj kriterijum. Po default-u, komanda `join` koristi prvo polje u datoteci, što je ono što nam treba. Takođe, `join` očekuje da su polja razdvojena razmacima, što je takođe ispunjeno, tako da možemo nastaviti sa spajanjem.

S obzirom da koristimo sve default vrednosti, naša komanda je vrlo jednostavna:

join file-1.txt file-2.txt

Komanda `join` datoteke tretira kao ‘datoteku jedan’ i ‘datoteku dva’, u redosledu kako su navedene u komandi.

Izlaz je sledeći:

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

Izlaz je formatiran na sledeći način: Prvo se prikazuje polje na kojem su redovi upareni, zatim ostala polja iz datoteke jedan, i na kraju polja iz datoteke dva, bez polja koje je korišćeno za uparivanje.

Nesortirana polja

Hajde da probamo nešto za šta znamo da neće funkcionisati. Stavićemo redove u jednoj datoteci van redosleda, tako da `join` neće moći ispravno da obradi datoteku. Sadržaj datoteke `file-3.txt` je identičan datoteci `file-2.txt`, s tim što je red broj osam umetnut između redova pet i šest.

Sadržaj datoteke `file-3.txt` je sledeći:

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

Unosimo sledeću komandu da pokušamo da spojimo datoteku `file-3.txt` sa datotekom `file-1.txt`:

join file-1.txt file-3.txt

`Join` izveštava da sedmi red u datoteci `file-3.txt` nije u ispravnom redosledu, te nije obrađen. Sedmi red je onaj koji počinje brojem šest, koji bi trebalo da se nalazi pre broja osam u ispravno sortiranoj listi. Šesti red u datoteci (koji počinje sa „8 Odell“) je poslednji koji je obrađen, tako da vidimo izlaz za njega.

Možete koristiti opciju `–check-order` ukoliko želite proveriti da li je `join` zadovoljan redosledom sortiranja datoteka – neće biti pokušaja spajanja.

Da bismo to uradili, unosimo sledeće:

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

`Join` vas unapred upozorava da će biti problema sa sedmim redom u datoteci `file-3.txt`.

Datoteke sa nedostajućim redovima

U datoteci `file-4.txt`, poslednji red je izbrisan, te red broj osam ne postoji. Sadržaj je sledeći:

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

Unosimo sledeće, i iznenađujuće, `join` se ne žali i obrađuje sve redove koje može:

join file-1.txt file-4.txt

Izlaz prikazuje sedam spojenih redova.

Opcija `-a` (print un-paired) govori komandi `join` da odštampa i one redove koji se ne mogu upariti.

Unosimo sledeću komandu da kažemo `join`-u da odštampa redove iz datoteke jedan koji se ne mogu upariti sa redovima u datoteci dva:

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

Sedam redova je upareno, a red osam iz datoteke jedan je odštampan, neuparen. Nema spojenih informacija, jer datoteka `file-4.txt` ne sadrži red broj osam sa kojim bi se mogao upariti. Ipak, ovaj red se i dalje pojavljuje u izlazu, tako da znate da nije pronađen par u datoteci `file-4.txt`.

Unosimo sledeću komandu `-v` (suppress joined lines) kako bismo otkrili sve redove koji se ne poklapaju:

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

Vidimo da je red osam jedini koji nema par u datoteci dva.

Uparivanje drugih polja

Hajde da uparimo dve nove datoteke koristeći polje koje nije default (polje jedan). Sadržaj datoteke `file-7.txt` je sledeći:

[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

A sledeći je sadržaj datoteke `file-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

Jedino razumno polje za spajanje je email adresa, koja je prvo polje u prvoj datoteci i drugo polje u drugoj. Da bismo ovo podesili, možemo koristiti opcije `-1` (datoteka jedan polje) i `-2` (datoteka dva polja). Pratimo ih sa brojem koji označava koje polje u svakoj datoteci treba koristiti za spajanje.

Unosimo sledeće da kažemo `join`-u da koristi prvo polje u datoteci jedan, a drugo polje u datoteci dva:

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

Datoteke se spajaju na osnovu email adrese, koja se prikazuje kao prvo polje svakog reda u izlazu.

Upotreba različitih separatora polja

Šta ako imate datoteke sa poljima koja su razdvojena nečim drugim osim razmaka?

Sledeće dve datoteke su razdvojene zarezima – jedini razmak se nalazi unutar naziva mesta koji se sastoje od više reči:

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

Možemo koristiti `-t` (separator) da kažemo `join`-u koji znak da koristi kao separator polja. U ovom slučaju, to je zarez, te unosimo sledeću komandu:

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

Svi redovi su upareni, a razmaci u nazivima mesta su sačuvani.

Ignorisanje velikih i malih slova

Druga datoteka, `file-9.txt`, je skoro identična datoteci `file-8.txt`. Jedina razlika je u tome što neke od email adresa sadrže velika slova, kao što je prikazano u nastavku:

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

Kada smo spojili `file-7.txt` i `file-8.txt`, funkcionisalo je savršeno. Hajde da vidimo šta se dešava sa `file-7.txt` i `file-9.txt`.

Unosimo sledeću komandu:

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

Upareno je samo šest redova. Razlike u velikim i malim slovima su sprečile spajanje druge dve email adrese.

Međutim, možemo koristiti opciju `-i` (ignore case) da nateramo `join` da ignoriše te razlike i upari polja koja sadrže isti tekst, bez obzira na velika i mala slova.

Unosimo sledeću komandu:

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

Svih osam redova je upareno i uspešno spojeno.

Zaključak

Komanda `join` je moćan alat koji vam može pomoći u procesu pripreme podataka. Možda treba da analizirate podatke, ili ih pripremate za uvoz u drugi sistem.

Bez obzira na situaciju, biće vam drago što imate `join` na raspolaganju!