Linux `join`: Slå sammen datafiler effektivt!

Sammenfletting av data fra tekstfiler med Linux «join»-kommando

Linux «join»-kommandoen er et kraftig verktøy for å kombinere informasjon fra to separate tekstfiler basert på et felles felt. Dette tilfører dynamikk til statiske datafiler. Vi skal utforske hvordan du kan bruke denne kommandoen for å koble sammen data på tvers av filer.

Datahåndtering på Tvers av Filer

I dagens data-drevne verden er data uvurderlig for bedrifter, organisasjoner og private husholdninger. Men når data er spredt over forskjellige filer, blir det fort en utfordring. Det er ikke bare vanskelig å finne den rette filen, men filene har ofte ulik struktur og formatering. Det administrative arbeidet med oppdatering, sikkerhetskopiering, arkivering og håndtering av filversjoner er også tidkrevende.

I tillegg oppstår et ekstra problem når det er behov for å samle data fra flere kilder for analyser. Hvordan skal dataene rasjonaliseres og forberedes på tvers av de ulike filene?

Heldigvis finnes det en løsning. Hvis filene deler minst ett felles dataelement, kan Linux «join»-kommandoen være til stor hjelp.

Eksempeldata

La oss se på to fiktive filer for å illustrere hvordan «join» kommandoen fungerer. Vi starter med filene «file-1.txt» og «file-2.txt».

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

Innholdet i «file-1.txt» er som følger:

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

Denne filen har nummererte linjer som inneholder:

  • Et tall
  • Et fornavn
  • Et etternavn
  • En e-postadresse
  • Kjønn
  • En IP-adresse

Innholdet i «file-2.txt» 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
8 Jursch [email protected] Male Hudson Valley $663,821.09

Hver linje i denne filen inneholder:

  • Et tall
  • Et etternavn
  • En e-postadresse
  • Kjønn
  • En region i New York
  • En verdi i dollar

«join»-kommandoen arbeider med «felt», som betyr en tekststreng avgrenset av mellomrom, starten av en linje eller slutten av en linje. For å koble linjer fra to filer, må de dele et felles felt.

Vi kan bare matche linjer som har et felles felt i begge filer. IP-adressen finnes bare i en fil, og fornavnet likeså. Etternavnet finnes i begge, men dette er ikke optimalt siden flere personer kan ha samme etternavn.

Kjønn og regioner i New York er ikke egnet for matching. Men e-postadressen finnes i begge filene, og er unik for hver person. En rask sammenligning av filene bekrefter at linjene i begge filene tilhører samme person. Vi kan dermed bruke enten linjenummer eller e-postadressen som felles felt for matching (vi skal bruke en annen metode senere).

Legg merke til at antall felter i filene varierer, noe som ikke er et problem. Vi kan spesifisere hvilket felt vi vil bruke i hver fil. Det er også viktig å være oppmerksom på felt som New York-regioner, som kan bestå av flere ord. Så lenge vi matcher på felt før disse regionene, går det bra.

«join» Kommandoen i Praksis

Feltet som skal brukes for å matche linjer, må være sortert. Vi har stigende tall i begge filer, så vi oppfyller det kriteriet. Som standard bruker «join» det første feltet i hver fil. En annen standardinnstilling er at feltene er separert med mellomrom. Siden dette stemmer med våre filer, kan vi bruke en enkel kommando.

Kommandoen ser slik ut:

join file-1.txt file-2.txt

Utdataene viser sammenslåtte linjer hvor «join» betrakter filene som henholdsvis «fil én» og «fil to», i den rekkefølgen de er angitt i kommandoen.

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

Utdataene formateres slik at det felles feltet skrives ut først, fulgt av de resterende feltene fra fil én, og deretter feltene fra fil to, unntatt det felles feltet.

Usorterte Felt

La oss prøve noe som ikke vil fungere. Vi endrer rekkefølgen i en av filene slik at «join» ikke kan behandle den korrekt. «file-3.txt» inneholder det samme som «file-2.txt», men linje åtte er flyttet mellom linje fem og seks.

Innholdet i «file-3.txt» er:

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

Når vi forsøker å koble «file-1.txt» og «file-3.txt» med følgende kommando:

join file-1.txt file-3.txt

Får vi en melding om at den syvende linjen i «file-3.txt» ikke er sortert korrekt og dermed ikke behandles. Den siste linjen som ble behandlet, var den sjette linjen i filen.

For å sjekke sorteringsrekkefølgen i en fil, kan du bruke «–check-order» alternativet uten å forsøke å slå sammen filene. Kommandoen vil se slik ut:

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

«join» vil da gi beskjed om at linje syv i filen «file-3.txt» vil forårsake problemer.

Filer med Manglende Linjer

I «file-4.txt» har vi fjernet den siste linjen, slik at den ikke har en linje åtte. Innholdet i filen 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 kommando, og «join» vil overraskende nok ikke klage, men behandle alle linjene som kan matches:

join file-1.txt file-4.txt

Utdataene viser syv matchede linjer.

Alternativet «-a» (print unpairable lines) forteller «join» å også skrive ut linjer som ikke kan matches.

For å få «join» til å skrive ut linjer fra fil én som ikke kan matches med linjer i fil to, bruker vi følgende kommando:

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

Syv linjer er matchet, og linje åtte fra fil én er skrevet ut uten samsvar. Det er ingen sammenslått informasjon fordi «file-4.txt» ikke inneholdt en linje åtte som den kunne matches med. Men den vises i utdataene, slik at du vet at den ikke har en match i «file-4.txt».

For å se alle linjer som ikke har samsvar, bruker vi kommandoen med alternativet «-v» (undertrykk matchede linjer):

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

Vi ser at linje åtte er den eneste som ikke har en match i fil to.

Matche Andre Felt

La oss nå matche to nye filer på et felt som ikke er standard (felt én). Innholdet i «file-7.txt» er:

[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 innholdet i «file-8.txt» er som følger:

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 feltet å bruke for matching er e-postadressen, som er felt én i den første filen og felt to i den andre. For å spesifisere dette bruker vi «-1» (fil ett felt) og «-2» (fil to felt) etterfulgt av nummeret for feltet i hver fil.

Vi bruker følgende kommando for å fortelle «join» å bruke det første feltet i fil én og det andre i fil to:

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

Filene slås sammen basert på e-postadressen, som vises som det første feltet i hver linje av utdataene.

Bruke Ulike Feltskillere

Hva om du har filer hvor feltene er separert med noe annet enn mellomrom?

De følgende filene er kommaseparert, og det eneste mellomrommet finnes mellom ord i stedsnavn:

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

Vi kan bruke «-t» (separator) for å fortelle «join» hvilket tegn som skal brukes som feltskiller. I dette tilfellet er det komma, og kommandoen blir:

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

Alle linjene er matchet, og mellomrom i stedsnavn er beholdt.

Ignorere Bokstaver

Filen «file-9.txt» er nesten identisk med «file-8.txt». Den eneste forskjellen er at noen e-postadresser inneholder store bokstaver, som vist under:

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 koblet «file-7.txt» og «file-8.txt» fungerte alt fint. La oss se hva som skjer når vi kobler «file-7.txt» og «file-9.txt».

Vi bruker følgende kommando:

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

Kun seks linjer ble matchet. Forskjellen i store og små bokstaver forhindret at to av e-postadressene ble koblet sammen.

Vi kan bruke alternativet «-i» (ignorer store og små bokstaver) for å tvinge «join» til å ignorere disse forskjellene og matche felt som inneholder den samme teksten, uavhengig av store og små bokstaver.

Vi bruker da følgende kommando:

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

Alle åtte linjene er matchet og slått sammen.

Oppsummering

Når du sliter med vanskelig databehandling, er «join» kommandoen en verdifull alliert. Enten du skal analysere data eller konvertere dem til et annet format for import til et annet system, er den et viktig verktøy.

Uansett hva situasjonen er, vil du være glad for at du kan bruke denne kommandoen!