Hur man använder kommandot join på Linux

Om du vill slå samman data från två textfiler genom att matcha ett gemensamt fält, kan du använda kommandot Linux join. Det ger ett stänk av dynamik till dina statiska datafiler. Vi visar dig hur du använder den.

Matchande data över filer

Data är kung. Både företag, företag och hushåll kör på det. Men data som lagras i olika filer och sammanställs av olika personer är jobbigt. Förutom att veta vilka filer som ska öppnas för att hitta den information du vill ha, kommer layouten och formatet på filerna troligen att vara annorlunda.

Du måste också hantera den administrativa huvudvärken för vilka filer som behöver uppdateras, vilka som måste säkerhetskopieras, vilka som är äldre och vilka som kan arkiveras.

Dessutom, om du behöver konsolidera din data eller göra någon analys över en hel datamängd, har du ytterligare ett problem. Hur rationaliserar du data över de olika filerna innan du kan göra vad du behöver göra med den? Hur närmar du dig databeredningsfasen?

Den goda nyheten är att om filerna delar minst ett gemensamt dataelement kan kommandot Linux join dra dig ur myren.

Datafilerna

All data vi kommer att använda för att demonstrera användningen av join-kommandot är fiktiv, med början med följande två filer:

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

Innehållet i

Följande är innehållet i file-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

Vi har en uppsättning numrerade rader, och varje rad innehåller all följande information:

Ett nummer
Ett förnamn
Ett efternamn
En e-postadress
Personens kön
En IP-adress

Följande är innehållet i fil-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

Varje rad i file-2.txt innehåller följande information:

Ett nummer
Ett efternamn
En e-postadress
Personens kön
En region i New York
Ett dollarvärde

Kommandot join fungerar med ”fält”, vilket i detta sammanhang betyder en textavsnitt omgiven av blanksteg, början på en rad eller slutet av en rad. För att join ska matcha rader mellan de två filerna måste varje rad innehålla ett gemensamt fält.

Därför kan vi bara matcha ett fält om det finns i båda filerna. IP-adressen visas bara i en fil, så det är inte bra. Förnamnet förekommer bara i en fil, så det kan vi inte använda heller. Efternamnet finns i båda filerna, men det skulle vara ett dåligt val, eftersom olika personer har samma efternamn.

Du kan inte binda samman uppgifterna med manliga och kvinnliga poster heller, eftersom de är för vaga. Regionerna i New York och dollarvärdena visas bara i en fil också.

Vi kan dock använda e-postadressen eftersom den finns i båda filerna, och var och en är unik för en individ. En snabb titt genom filerna bekräftar också att raderna i varje motsvarar samma person, så vi kan använda radnumren som vårt fält för att matcha (vi använder ett annat fält senare).

Notera att det finns olika antal fält i de två filerna, vilket är bra – vi kan berätta för sammanfogning vilket fält som ska användas från varje fil.

Men se upp för fält som regionerna i New York; i en mellanslagsseparerad fil ser varje ord i namnet på en region ut som ett fält. Eftersom vissa regioner har två- eller treordsnamn, har du faktiskt ett annat antal fält inom samma fil. Detta är okej, så länge du matchar på fält som visas i raden före New York-regionerna.

Kommandot join

Först måste fältet du ska matcha sorteras. Vi har stigande siffror i båda filerna, så vi uppfyller det kriteriet. Som standard använder join det första fältet i en fil, vilket är vad vi vill ha. En annan vettig standard är att join förväntar sig att fältseparatorerna är blanksteg. Återigen, vi har det, så vi kan gå vidare och sätta igång med.

Eftersom vi använder alla standardinställningar är vårt kommando enkelt:

join file-1.txt file-2.txt

De

join anser att filerna är ”fil ett” och ”fil två” enligt den ordning som de är listade på kommandoraden.

Utgången är som följer:

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

Utdata formateras på följande sätt: Fältet som raderna matchades på skrivs ut först, följt av de andra fälten från fil ett och sedan fälten från fil två utan matchningsfältet.

Osorterade fält

Låt oss prova något vi vet inte kommer att fungera. Vi lägger raderna i en fil ur funktion så join kommer inte att kunna behandla filen korrekt. Innehållet i fil-3.txt är detsamma som fil-2.txt, men rad åtta är mellan rad fem och sex.

Följande är innehållet i file-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

Vi skriver följande kommando för att försöka ansluta file-3.txtto file-1.txt:

join file-1.txt file-3.txt

De

join rapporterar att den sjunde raden i fil-3.txt är ur funktion, så den bearbetas inte. Rad sju är den som börjar med siffran sex, som ska komma före åtta i en korrekt sorterad lista. Den sjätte raden i filen (som börjar med ”8 Odell”) var den sista som bearbetades, så vi ser utdata för den.

Du kan använda alternativet –check-order om du vill se om join är nöjd med sorteringsordningen för en fil – ingen sammanslagning kommer att göras.

För att göra det skriver vi följande:

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

De

join berättar i förväg att det kommer att bli ett problem med rad sju i filen file-3.txt.

Filer med saknade rader

I file-4.txt har den sista raden tagits bort, så det finns inte en rad åtta. Innehållet är som följer:

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

Vi skriver följande och överraskande nog klagar join inte och behandlar alla rader det kan:

join file-1.txt file-4.txt

De

Utdatan listar sju sammanslagna rader.

Alternativet -a (skriv ut oparbart) säger till join att även skriva ut de rader som inte kunde matchas.

Här skriver vi följande kommando för att berätta för join att skriva ut raderna från fil ett som inte kan matchas med raderna i fil två:

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

De

Sju rader matchas, och rad åtta från fil ett skrivs ut, omatchad. Det finns ingen sammanslagen information eftersom file-4.txt inte innehöll en rad åtta som den kunde matchas till. Men det visas åtminstone fortfarande i utdata så att du vet att det inte har en matchning i file-4.txt.

Vi skriver följande kommando -v (undertryck sammanfogade linjer) för att avslöja alla rader som inte matchar:

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

De

Vi ser att rad åtta är den enda som inte har en matchning i fil två.

Matcha andra fält

Låt oss matcha två nya filer på ett fält som inte är standard (fält ett). Följande är innehållet i file-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

Och följande är innehållet i 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

Det enda vettiga fältet att använda för att gå med är e-postadressen, som är fält ett i den första filen och fält två i den andra. För att tillgodose detta kan vi använda alternativen -1 (fil ett fält) och -2 (fil två fält). Vi följer dessa med ett nummer som anger vilket fält i varje fil som ska användas för att gå med.

Vi skriver följande för att tala om för join att använda det första fältet i fil ett och det andra i fil två:

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

De

Filerna sammanfogas på e-postadressen, som visas som det första fältet på varje rad i utgången.

Använda olika fältseparatorer

Vad händer om du har filer med fält som är åtskilda av något annat än blanksteg?

Följande två filer är kommaavgränsade – det enda blanktecken är mellan platsnamnen med flera ord:

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

Innehållet i

Vi kan använda -t (separatortecken) för att berätta för join vilket tecken som ska användas som fältseparator. I det här fallet är det kommatecken, så vi skriver följande kommando:

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

De

Alla rader är matchade, och mellanrummen är bevarade i ortnamnen.

Ignorerar brevfall

En annan fil, file-9.txt, är nästan identisk med file-8.txt. Den enda skillnaden är att några av e-postadresserna har en stor bokstav, som visas nedan:

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

När vi slog ihop file-7.txt och file-8.txt fungerade det perfekt. Låt oss se vad som händer med file-7.txt och file-9.txt.

Vi skriver följande kommando:

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

De

Vi matchade bara sex rader. Skillnaderna i stora och små bokstäver hindrade de andra två e-postadresserna från att slås samman.

Däremot kan vi använda alternativet -i (ignorera skiftläge) för att tvinga sammanfogning för att ignorera de skillnader och matcha fält som innehåller samma text, oavsett skiftläge.

Vi skriver följande kommando:

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

De

Alla åtta raderna matchas och sammanfogas framgångsrikt.

Mixa och matcha

Genom att gå med har du en kraftfull allierad när du brottas med obekväma dataförberedelser. Kanske behöver du analysera data, eller så kanske du försöker massera in den i form för att utföra en import till ett annat system.

Oavsett hur situationen är, kommer du att vara glad att du är med i ditt hörn!