Sådan bruger du join-kommandoen på Linux

Hvis du vil flette data fra to tekstfiler ved at matche et fælles felt, kan du bruge kommandoen Linux join. Det tilføjer et drys af dynamik til dine statiske datafiler. Vi viser dig, hvordan du bruger det.

Matchende data på tværs af filer

Data er konge. Både virksomheder, virksomheder og husholdninger kører på det. Men data gemt i forskellige filer og samlet af forskellige mennesker er en smerte. Ud over at vide, hvilke filer der skal åbnes for at finde den information, du ønsker, vil layoutet og formatet af filerne sandsynligvis være anderledes.

Du skal også forholde dig til den administrative hovedpine af, hvilke filer der skal opdateres, hvilke der skal sikkerhedskopieres, hvilke er arvet, og hvilke der kan arkiveres.

Plus, hvis du har brug for at konsolidere dine data eller udføre nogle analyser på tværs af et helt datasæt, har du et ekstra problem. Hvordan rationaliserer du dataene på tværs af de forskellige filer, før du kan gøre, hvad du skal med dem? Hvordan griber du dataforberedelsesfasen an?

Den gode nyhed er, at hvis filerne deler mindst ét ​​fælles dataelement, kan Linux join-kommandoen trække dig ud af mosen.

Datafilerne

Alle de data, vi vil bruge til at demonstrere brugen af ​​join-kommandoen, er fiktive, startende med følgende to filer:

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

Indholdet af

Følgende er indholdet af fil-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 et sæt nummererede linjer, og hver linje indeholder alle følgende oplysninger:

Et nummer
Et fornavn
Et efternavn
En e-mailadresse
Personens køn
En IP-adresse

Følgende er indholdet af 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

Hver linje i file-2.txt indeholder følgende oplysninger:

Et nummer
Et efternavn
En e-mailadresse
Personens køn
En region i New York
En dollarværdi

Kommandoen join fungerer med “felter”, som i denne sammenhæng betyder en tekstsektion omgivet af mellemrum, starten på en linje eller slutningen af ​​en linje. For at join kan matche linjer mellem de to filer, skal hver linje indeholde et fælles felt.

Derfor kan vi kun matche et felt, hvis det vises i begge filer. IP-adressen vises kun i én fil, så det er ikke godt. Fornavnet optræder kun i én fil, så det kan vi heller ikke bruge. Efternavnet er i begge filer, men det ville være et dårligt valg, da forskellige personer har det samme efternavn.

  Sådan bruges Tidal Music fra kommandolinjen på Linux

Du kan heller ikke binde dataene sammen med mandlige og kvindelige poster, fordi de er for vage. Regionerne i New York og dollarværdierne vises også kun i én fil.

Vi kan dog bruge e-mailadressen, fordi den er til stede i begge filer, og hver enkelt er unik for en person. Et hurtigt kig gennem filerne bekræfter også, at linjerne i hver svarer til den samme person, så vi kan bruge linjenumrene som vores felt til at matche (vi bruger et andet felt senere).

Bemærk, at der er et forskelligt antal felter i de to filer, hvilket er fint – vi kan fortælle dig, hvilket felt der skal bruges fra hver fil.

Pas dog på marker som regionerne i New York; i en mellemrumssepareret fil ser hvert ord i navnet på en region ud som et felt. Fordi nogle områder har to- eller tre-ords navne, har du faktisk et andet antal felter i den samme fil. Dette er okay, så længe du matcher på felter, der vises i linjen før New York-regionerne.

Deltag-kommandoen

Først skal det felt, du skal matche, sorteres. Vi har stigende tal i begge filer, så vi opfylder de kriterier. Som standard bruger join det første felt i en fil, hvilket er det vi ønsker. En anden fornuftig standard er, at join forventer, at feltseparatorerne er mellemrum. Igen, vi har det, så vi kan gå videre og fyre op med at deltage.

Da vi bruger alle standardindstillingerne, er vores kommando enkel:

join file-1.txt file-2.txt

Det

join anser filerne for at være “fil et” og “fil to” i overensstemmelse med den rækkefølge, de er opført på kommandolinjen.

Udgangen er som følger:

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

Outputtet formateres på følgende måde: Feltet, linjerne blev matchet på, udskrives først, efterfulgt af de andre felter fra fil et, og derefter felterne fra fil to uden matchfeltet.

Usorterede felter

Lad os prøve noget, vi ved ikke vil virke. Vi sætter linjerne i én fil ude af rækkefølge, så join vil ikke være i stand til at behandle filen korrekt. Indholdet af fil-3.txt er det samme som fil-2.txt, men linje otte er mellem linje fem og seks.

  Sådan udtrækkes oplysninger fra MKV'er på Linux

Følgende er indholdet af fil-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ølgende kommando for at prøve at forbinde fil-3.txt til fil-1.txt:

join file-1.txt file-3.txt

Det

join rapporterer, at den syvende linje i fil-3.txt er ude af drift, så den er ikke behandlet. Linje syv er den, der begynder med tallet seks, som skal komme før otte i en korrekt sorteret liste. Den sjette linje i filen (som begynder med “8 Odell”) var den sidst behandlede, så vi ser output for den.

Du kan bruge -check-order-indstillingen, hvis du vil se, om join er tilfreds med sorteringsrækkefølgen af ​​en fil – der vil ikke blive forsøgt at flette.

For at gøre det skriver vi følgende:

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

Det

join fortæller dig på forhånd, at der vil være et problem med linje syv i filen file-3.txt.

Filer med manglende linjer

I fil-4.txt er den sidste linje blevet fjernet, så der er ikke en linje otte. Indholdet er som følger:

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ølgende, og overraskende nok klager join ikke og behandler alle de linjer, det kan:

join file-1.txt file-4.txt

Det

Outputtet viser syv flettede linjer.

Indstillingen -a (udskriv ikke parret) fortæller join også at udskrive de linjer, der ikke kunne matches.

Her skriver vi følgende kommando for at fortælle join at udskrive linjerne fra fil et, der ikke kan matches med linjerne i fil to:

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

Det

Syv linjer er matchet, og linje otte fra fil et er udskrevet, umatchede. Der er ingen flettet information, fordi file-4.txt ikke indeholdt en linje otte, som den kunne matches med. Men i det mindste vises det stadig i outputtet, så du ved, at det ikke har et match i file-4.txt.

Vi skriver følgende kommando -v (undertryk sammenføjede linjer) for at afsløre alle linjer, der ikke matcher:

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

Det

Vi ser, at linje otte er den eneste, der ikke har et match i fil to.

Matchende andre felter

Lad os matche to nye filer på et felt, der ikke er standard (felt et). Følgende er indholdet af fil-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

Og følgende er indholdet af 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 eneste fornuftige felt at bruge til at deltage er e-mailadressen, som er felt et i den første fil og felt to i den anden. For at imødekomme dette kan vi bruge mulighederne -1 (fil ét felt) og -2 (fil to felt). Vi følger disse med et nummer, der angiver, hvilket felt i hver fil, der skal bruges til at deltage.

  Sådan installeres Pgadmin på Linux

Vi skriver følgende for at fortælle join at bruge det første felt i fil et og det andet i fil to:

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

Det

Filerne sammenføjes på e-mailadressen, som vises som det første felt på hver linje i outputtet.

Brug af forskellige feltseparatorer

Hvad hvis du har filer med felter, der er adskilt af noget andet end mellemrum?

De følgende to filer er kommasepareret – det eneste mellemrum er mellem stednavne med flere ord:

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

Indholdet af

Vi kan bruge -t (separatortegn) til at fortælle join, hvilket tegn der skal bruges som feltseparator. I dette tilfælde er det kommaet, så vi skriver følgende kommando:

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

Det

Alle linjerne er afstemt, og mellemrummene er bevaret i stednavnene.

Ignorerer Letter Case

En anden fil, file-9.txt, er næsten identisk med file-8.txt. Den eneste forskel er, at nogle af e-mailadresserne har et stort bogstav, som vist nedenfor:

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

Da vi sluttede os til file-7.txt og file-8.txt, fungerede det perfekt. Lad os se, hvad der sker med file-7.txt og file-9.txt.

Vi skriver følgende kommando:

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

Det

Vi matchede kun seks linjer. Forskellene i store og små bogstaver forhindrede de to andre e-mailadresser i at blive sammenføjet.

Vi kan dog bruge muligheden -i (ignorer store og små bogstaver) til at tvinge join for at ignorere disse forskelle og matche felter, der indeholder den samme tekst, uanset store og små bogstaver.

Vi skriver følgende kommando:

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

Det

Alle otte linjer er matchet og sammenføjet med succes.

Mix og match

Når du deltager, har du en stærk allieret, når du kæmper med akavet dataforberedelse. Måske skal du analysere dataene, eller måske prøver du at massere dem i form for at udføre en import til et andet system.

Uanset hvordan situationen er, vil du være glad for, at du er med i dit hjørne!