
Als u gegevens uit twee tekstbestanden wilt samenvoegen door een gemeenschappelijk veld te matchen, kunt u de Linux join opdracht. Het voegt een vleugje dynamiek toe aan uw statische gegevensbestanden. We laten u zien hoe u het kunt gebruiken.
Overeenkomende gegevens tussen bestanden
Data is koning. Bedrijven, bedrijven en huishoudens draaien erop. Maar gegevens die in verschillende bestanden zijn opgeslagen en door verschillende mensen zijn verzameld, is lastig. Naast het weten welke bestanden moeten worden geopend om de gewenste informatie te vinden, zullen de lay-out en het formaat van de bestanden waarschijnlijk verschillen.
Je hebt ook te maken met de administratieve hoofdpijn van welke bestanden moeten worden bijgewerkt, waarvan een back-up moet worden gemaakt, welke legacy zijn en die kunnen worden gearchiveerd.
En als u uw gegevens moet consolideren of een analyse van een volledige gegevensset moet uitvoeren, heeft u een bijkomend probleem. Hoe rationaliseer je de gegevens over de verschillende bestanden voordat je kunt doen wat je ermee moet doen? Hoe benader je de datavoorbereidingsfase?
Het goede nieuws is dat de bestanden ten minste één gemeenschappelijk gegevenselement delen, de Linux join commando kan je uit het slijk trekken.
De gegevensbestanden
Alle gegevens die we zullen gebruiken om het gebruik van de join commando is fictief en begint met de volgende twee bestanden:
cat file-1.txt
cat file-2.txt

Het volgende is de inhoud van file-1.txt:
1 Adore Varian avarian0@newyorker.com Female 192.57.150.231 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 8 Odell Jursch ojursch7@utexas.edu Male 1.138.85.117
We hebben een reeks genummerde regels en elke regel bevat alle volgende informatie:
- Een getal
- Een voornaam
- Een achternaam
- Een e-mailadres
- Het geslacht van de persoon
- Een IP-adres
Het volgende is de inhoud van file-2.txt:
1 Varian avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp Female Capital District $674,634.93 8 Jursch ojursch7@utexas.edu Male Hudson Valley $663,821.09
Elke regel in file-2.txt bevat de volgende informatie:
- Een getal
- Een achternaam
- Een e-mailadres
- Het geslacht van de persoon
- Een regio in New York
- Een dollarwaarde
De join commando werkt met “velden”, wat in deze context een tekstgedeelte betekent dat wordt omgeven door witruimte, het begin van een regel of het einde van een regel. Voor join om regels tussen de twee bestanden te matchen, moet elke regel een gemeenschappelijk veld bevatten.
Daarom kunnen we een veld alleen matchen als het in beide bestanden voorkomt. Het IP-adres komt maar in één bestand voor, dus dat is niet goed. De voornaam komt maar in één bestand voor, dus die kunnen we ook niet gebruiken. De achternaam staat in beide bestanden, maar het zou een slechte keuze zijn, aangezien verschillende mensen dezelfde achternaam hebben.
Je kunt de gegevens ook niet samenvoegen met de mannelijke en vrouwelijke vermeldingen, omdat ze te vaag zijn. De regio’s New York en de dollarwaarden verschijnen ook maar in één bestand.
We kunnen het e-mailadres echter gebruiken omdat het in beide bestanden aanwezig is en elk uniek is voor een individu. Een snelle blik door de bestanden bevestigt ook dat de regels in elk overeenkomen met dezelfde persoon, zodat we de regelnummers kunnen gebruiken als ons veld dat overeenkomt (we zullen later een ander veld gebruiken).
Merk op dat er een verschillend aantal velden is in de twee bestanden, en dat is prima – dat kunnen we zien join welk veld uit elk bestand moet worden gebruikt.
Pas echter op voor velden zoals de regio’s van New York; in een door spaties gescheiden bestand ziet elk woord in de naam van een regio eruit als een veld. Omdat sommige regio’s namen van twee of drie woorden hebben, heeft u in feite een ander aantal velden in hetzelfde bestand. Dit is oké, zolang je maar overeenkomt op velden die in de regel voor de New York-regio’s verschijnen.
Het samenvoegen Command
Ten eerste moet het veld dat u wilt matchen, worden gesorteerd. We hebben oplopende cijfers in beide bestanden, dus we voldoen aan die criteria. Standaard, join gebruikt het eerste veld in een bestand, en dat is wat we willen. Een andere verstandige standaard is dat join verwacht dat de veldscheidingstekens witruimte zijn. Nogmaals, we hebben dat, dus we kunnen doorgaan en beginnen join.
Omdat we alle standaardinstellingen gebruiken, is onze opdracht eenvoudig:
join file-1.txt file-2.txt

join beschouwt de bestanden als “bestand één” en “bestand twee” volgens de volgorde waarin ze worden vermeld op de opdrachtregel.
De output is als volgt:
1 Adore Varian avarian0@newyorker.com Female 192.57.150.231 Varian avarian0@newyorker.com Female Western New York $535,304.73 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 Standen ustanden6@geocities.jp Female Capital District $674,634.93 8 Odell Jursch ojursch7@utexas.edu Male 1.138.85.117 Jursch ojursch7@utexas.edu Male Hudson Valley $663,821.09
De uitvoer wordt op de volgende manier opgemaakt: Het veld waarop de regels werden gematcht, wordt eerst afgedrukt, gevolgd door de andere velden uit bestand één en vervolgens de velden uit bestand twee zonder het vergelijkingsveld.
Ongesorteerde velden
Laten we iets proberen waarvan we weten dat het niet werkt. We plaatsen de regels in één bestand dus niet in de juiste volgorde join zal het bestand niet correct kunnen verwerken. De inhoud van file-3.txt zijn hetzelfde als file-2.txt, maar regel acht is tussen regel vijf en zes.
Het volgende is de inhoud van file-3.txt:
1 Varian avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 8 Jursch ojursch7@utexas.edu Male Hudson Valley $663,821.09 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp Female Capital District $674,634.93
We typen het volgende commando om te proberen mee te doen file-3.txtnaar file-1.txt:
join file-1.txt file-3.txt

join meldt dat de zevende regel in file-3.txt is defect, dus het wordt niet verwerkt. Regel zeven is degene die begint met het cijfer zes, dat voor acht moet komen in een correct gesorteerde lijst. De zesde regel in het bestand (die begint met “8 Odell”) was de laatste die werd verwerkt, dus we zien de uitvoer ervoor.
U kunt de --check-order optie als u wilt zien of join is tevreden met de sorteervolgorde van bestanden – er wordt niet geprobeerd samen te voegen.
Om dit te doen, typen we het volgende:
join --check-order file-1.txt file-3.txt

join vertelt u van tevoren dat er een probleem zal zijn met regel zeven van het bestand file-3.txt.
Bestanden met ontbrekende regels
In file-4.txt, is de laatste regel verwijderd, dus er is geen regel acht. De inhoud is als volgt:
1 Varian avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp Female Capital District $674,634.93
We typen het volgende en, verrassend genoeg, join klaagt niet en verwerkt alle regels die het kan:
join file-1.txt file-4.txt

De uitvoer bevat zeven samengevoegde regels.
De -a (print unpairable) optie vertelt join om ook de regels af te drukken die niet konden worden vergeleken.
Hier typen we het volgende commando om te vertellen join om de regels uit bestand één af te drukken die niet kunnen worden gekoppeld aan regels in bestand twee:
join -a 1 file-1.txt file-4.txt

Zeven regels komen overeen, en regel acht uit bestand één wordt ongeëvenaard afgedrukt. Er is geen samengevoegde informatie omdat file-4.txt bevatte geen regel acht waaraan het kon worden gekoppeld. Het verschijnt echter nog steeds in de uitvoer, zodat u weet dat er geen overeenkomst in file-4.txt.
We typen het volgende -v (onderdruk samengevoegde regels) om alle regels weer te geven die geen overeenkomst hebben:
join -v file-1.txt file-4.txt

We zien dat regel acht de enige is die geen overeenkomst heeft in bestand twee.
Overeenkomende andere velden
Laten we twee nieuwe bestanden matchen op een veld dat niet de standaard is (veld één). Het volgende is de inhoud van bestand-7.txt:
avarian0@newyorker.com Female 192.57.150.231 dsealeaf4@nps.gov Female 210.53.81.212 fbezley5@lulu.com Male 72.173.218.75 hfriett2@dagondesign.com Female 33.167.32.89 nmerrell1@ted.com Female 22.198.121.181 ojursch7@utexas.edu Male 1.138.85.117 tvenmore3@gmpg.org Female 251.9.204.115 ustanden6@geocities.jp Female 4.204.0.237
En het volgende is de inhoud van bestand-8.txt:
Female avarian0@newyorker.com Western New York $535,304.73 Female dsealeaf4@nps.gov North Country $126,690.15 Male fbezley5@lulu.com Mohawk Valley $366,733.78 Female hfriett2@dagondesign.com Southern Tier $461,664.44 Female nmerrell1@ted.com Finger Lakes $309,033.10 Male ojursch7@utexas.edu Hudson Valley $663,821.09 Female tvenmore3@gmpg.org Central New York $175,818.02 Female ustanden6@geocities.jp Capital District $674,634.93
Het enige verstandige veld dat u kunt gebruiken om lid te worden, is het e-mailadres, dat is veld één in het eerste bestand en veld twee in het tweede. Om dit mogelijk te maken, kunnen we de -1 (bestand één veld) en -2 (bestand twee velden) opties. We volgen deze met een nummer dat aangeeft welk veld in elk bestand moet worden gebruikt om mee te doen.
We typen het volgende om te vertellen join om het eerste veld in bestand één en het tweede in bestand twee te gebruiken:
join -1 1 -2 2 file-7.txt file-8.txt

De bestanden worden samengevoegd op het e-mailadres, dat wordt weergegeven als het eerste veld van elke regel in de uitvoer.
Verschillende veldscheidingstekens gebruiken
Wat als u bestanden heeft met velden die zijn gescheiden door iets anders dan witruimte?
De volgende twee bestanden zijn door komma’s gescheiden – de enige witruimte bevindt zich tussen de plaatsnamen met meerdere woorden:
cat file-5.txt
cat file-6.txt

We kunnen de -t (scheidingsteken) om te vertellen join welk teken moet worden gebruikt als veldscheidingsteken. In dit geval is het de komma, dus typen we het volgende commando:
join -t, file-5.txt file-6.txt

Alle regels komen overeen en de spaties blijven behouden in de plaatsnamen.
Letter Case negeren
Een ander bestand, file-9.txt, is bijna identiek aan file-8.txt. Het enige verschil is dat sommige e-mailadressen een hoofdletter hebben, zoals hieronder weergegeven:
Female avarian0@newyorker.com Western New York $535,304.73 Female dsealeaf4@nps.gov North Country $126,690.15 Male Fbezley5@lulu.com Mohawk Valley $366,733.78 Female hfriett2@dagondesign.com Southern Tier $461,664.44 Female nmerrell1@ted.com Finger Lakes $309,033.10 Male Ojursch7@utexas.edu Hudson Valley $663,821.09 Female tvenmore3@gmpg.org Central New York $175,818.02 Female ustanden6@geocities.jp Capital District $674,634.93
Toen we lid werden file-7.txt en file-8.txt, het werkte perfect. Eens kijken wat er mee gebeurt file-7.txt en file-9.txt.
We typen het volgende commando:
join -1 1 -2 2 file-7.txt file-9.txt

We hebben slechts zes regels gecombineerd. Door de verschillen in hoofdletters en kleine letters konden de andere twee e-mailadressen niet worden samengevoegd.
We kunnen echter de -i (hoofdlettergebruik negeren) optie om te forceren join om die verschillen te negeren en velden te matchen die dezelfde tekst bevatten, ongeacht hoofdletters en kleine letters.
We typen het volgende commando:
join -1 1 -2 2 -i file-7.txt file-9.txt

Alle acht lijnen zijn op elkaar afgestemd en succesvol samengevoegd.
Mix en match
In join, je hebt een krachtige bondgenoot als je worstelt met lastige gegevensvoorbereiding. Misschien moet u de gegevens analyseren, of misschien probeert u ze in vorm te masseren om een import naar een ander systeem uit te voeren.
Wat de situatie ook is, je zult blij zijn dat je dat hebt gedaan join in je hoek!