Hur man använder kommandot join på Linux

By rik

Om du behöver kombinera information från två textdokument genom att hitta matchningar i ett gemensamt datafält, är kommandot Linux `join` ett användbart verktyg. Det tillför en extra dimension till hanteringen av dina datafiler. Låt oss undersöka hur du kan utnyttja det.

Sammanförande av data från flera filer

Data är av fundamental betydelse idag. Det styr verksamheten i företag, organisationer och hushåll. Men hanteringen av data som är utspridd över olika filer och som har sammanställts av olika personer kan vara komplicerad. Förutom att hålla reda på vilka filer som innehåller den information du söker, är det vanligt att filernas layout och format skiljer sig åt.

Dessutom tillkommer administrativ huvudvärk kring vilka filer som behöver uppdateras, säkerhetskopieras, vilka som är föråldrade och vilka som kan arkiveras.

Om du behöver sammanställa din data eller utföra analyser över hela datasetet, uppstår ytterligare utmaningar. Hur ska du strukturera datan från de olika filerna innan du kan använda den? Hur ska du hantera databearbetningsfasen?

Lyckligtvis kan kommandot Linux `join` vara till stor hjälp om filerna delar minst ett gemensamt dataelement.

Exempeldata

All data som används för att illustrera användningen av `join`-kommandot är fiktiv. Vi startar med följande två filer:

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

Nedan visas innehållet i filen `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 numrerade rader, där varje rad innehåller följande uppgifter:

Ett unikt nummer
Förnamn
Efternamn
E-postadress
Kön
IP-adress

Här är innehållet i `file-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` har följande data:

Ett unikt nummer
Efternamn
E-postadress
Kön
En region i New York
En summa i dollar

Kommandot `join` arbetar med ”fält”, som i det här sammanhanget är textstycken avgränsade av blanksteg, radens början eller radens slut. För att `join` ska kunna matcha rader från de två filerna, måste varje rad ha ett gemensamt fält.

Vi kan endast matcha ett fält om det finns i båda filerna. IP-adressen finns bara i en fil, så den är inte användbar. Förnamnet finns också bara i en fil. Efternamnet finns i båda filerna, men det är inte ett bra val då olika personer kan ha samma efternamn.

Kön kan inte heller användas för att länka data eftersom det är för allmänt. Regionerna i New York och dollarvärden finns också bara i en fil.

Däremot kan vi använda e-postadressen då den finns i båda filerna och varje e-postadress är unik för en individ. Genom att snabbt gå igenom filerna kan vi också konstatera att raderna i varje fil motsvarar samma person, vilket betyder att vi kan använda radnumren som vårt matchningsfält (vi kommer att använda ett annat fält senare).

Observera att antalet fält skiljer sig mellan de två filerna, vilket är helt okej – vi kan specificera för `join` vilket fält som ska användas från varje fil.

Men, var uppmärksam på fält som New York-regionerna; i en fil där fält separeras med blanksteg kommer varje ord i regionens namn att tolkas som ett eget fält. Eftersom vissa regioner har namn med två eller tre ord, kan antalet fält skilja sig åt inom samma fil. Detta är inget problem så länge du matchar på fält som kommer före New York-regionerna.

Användning av kommandot `join`

Först måste fältet som ska matchas vara sorterat. Vi har stigande siffror i båda filerna, vilket uppfyller kriteriet. Som standard använder `join` det första fältet i varje fil, vilket passar oss bra. En annan standard är att `join` förväntar sig att fält separeras med blanksteg. Även det stämmer överens med vår data, så vi kan gå vidare.

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

join file-1.txt file-2.txt

`join` identifierar filerna som ”fil ett” och ”fil två” i den ordning de anges på kommandoraden.

Resultatet ser ut så här:

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 som följer: Fältet som raderna matchades på skrivs ut först, följt av de övriga fälten från fil ett och sedan fälten från fil två, exklusive matchningsfältet.

Osorterade fält

Låt oss prova något som vi vet inte kommer att fungera. Vi ändrar ordningen på raderna i en fil så att `join` inte kan behandla den korrekt. Innehållet i `file-3.txt` är samma som `file-2.txt`, men rad åtta har flyttats mellan rad fem och sex.

Här ä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 sammankoppla `file-3.txt` med `file-1.txt`:

join file-1.txt file-3.txt

`join` rapporterar att den sjunde raden i `file-3.txt` är i fel ordning och att den inte kommer att bearbetas. 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 kontrollera om `join` är nöjd med sorteringsordningen i en fil – ingen sammanslagning kommer att utföras.

Vi gör detta med följande kommando:

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

`join` meddelar i förväg att det kommer att uppstå problem med rad sju i `file-3.txt`.

Filer med saknade rader

I `file-4.txt` har den sista raden tagits bort, vilket betyder att det inte finns en rad åtta. Innehållet är följande:

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 kommando, och överraskande nog klagar inte `join`, utan bearbetar alla rader som den kan:

join file-1.txt file-4.txt

Utdata visar sju sammanslagna rader.

Alternativet `-a` (skriv ut omatchade) instruerar `join` att även skriva ut de rader som inte kunde matchas.

Här skriver vi följande kommando för att be `join` 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

Sju rader matchas, och rad åtta från fil ett skrivs ut, utan att vara matchad. Det saknas sammanslagen information eftersom `file-4.txt` inte innehöll en rad åtta som den kunde matchas med. Men den visas åtminstone i utdata, så att du vet att den saknar en motsvarighet i `file-4.txt`.

Vi använder kommandot `-v` (utelämna sammanslagna rader) för att visa alla rader som inte matchar:

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

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

Matcha andra fält

Låt oss matcha två nya filer med ett annat fält än standard (fält ett). Här ä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 här ä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 meningsfulla fältet att använda för att koppla samman är e-postadressen, som är fält ett i den första filen och fält två i den andra. För att åstadkomma detta kan vi använda alternativen `-1` (fält i fil ett) och `-2` (fält i fil två). Vi följer dessa med ett nummer som anger vilket fält i respektive fil som ska användas för sammankopplingen.

Vi använder följande kommando för att berätta 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

Filerna sammanfogas nu med hjälp av e-postadressen, som visas som det första fältet i varje rad i utdata.

Använda andra fältavgränsare

Vad händer om du har filer där fälten avgränsas av något annat än blanksteg?

Följande två filer är kommaavgränsade – det enda blankstecket finns i namn som innehåller flera ord:

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

Vi kan använda `-t` (avgränsartecken) för att tala om för `join` vilket tecken som ska användas som fältavgränsare. I det här fallet är det kommatecken, så vi använder följande kommando:

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

Alla rader matchas, och mellanrummen i ortsnamnen bevaras.

Ignorera skiftläge

En annan fil, `file-9.txt`, är nästan identisk med `file-8.txt`. Den enda skillnaden är att vissa av e-postadresserna har versaler, 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 kopplade samman `file-7.txt` och `file-8.txt` fungerade allt perfekt. Låt oss se vad som händer med `file-7.txt` och `file-9.txt`.

Vi använder följande kommando:

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

Vi har bara lyckats matcha sex rader. Skillnaderna i skiftläge hindrade de andra två e-postadresserna från att kopplas samman.

Vi kan dock använda alternativet `-i` (ignorera skiftläge) för att tvinga `join` att bortse från dessa skillnader och matcha fält som innehåller samma text, oavsett skiftläge.

Vi använder nu följande kommando:

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

Nu matchas alla åtta raderna och sammanfogas framgångsrikt.

Mix och match

Med `join` har du en kraftfull bundsförvant när du hanterar besvärlig databearbetning. Du kanske behöver analysera data eller omvandla den till ett format som kan importeras till ett annat system.

Oavsett situation kommer du att vara glad att `join` finns vid din sida!