Jak používat příkaz join v systému Linux

Pokud chcete sloučit data ze dvou textových souborů pomocí shody společného pole, můžete použít příkaz Linux join. Dodává vašim statickým datovým souborům trochu dynamiky. Ukážeme vám, jak jej používat.

Párování dat napříč soubory

Dat je král. Běží na něm korporace, firmy i domácnosti. Ale data uložená v různých souborech a shromážděná různými lidmi jsou bolestivá. Kromě toho, že víte, které soubory otevřít, abyste našli požadované informace, se pravděpodobně bude lišit i rozložení a formát souborů.

Musíte se také vypořádat s administrativní bolestí, které soubory je třeba aktualizovat, které je třeba zálohovat, které jsou zastaralé a které lze archivovat.

Navíc, pokud potřebujete konsolidovat svá data nebo provést analýzu celého souboru dat, máte další problém. Jak racionalizujete data v různých souborech, než s nimi budete moci udělat to, co potřebujete? Jak přistupujete k fázi přípravy dat?

Dobrou zprávou je, že pokud soubory sdílejí alespoň jeden společný datový prvek, příkaz Linux join vás může vytáhnout z bahna.

Datové soubory

Všechna data, která použijeme k demonstraci použití příkazu join, jsou fiktivní, počínaje následujícími dvěma soubory:

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

Obsah

Níže je uveden obsah souboru-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

Máme sadu očíslovaných řádků a každý řádek obsahuje všechny následující informace:

Číslo
Křestní jméno
příjmení
E-mailová adresa
Pohlaví osoby
IP adresa

Níže je uveden obsah souboru-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

Každý řádek v souboru-2.txt obsahuje následující informace:

Číslo
příjmení
E-mailová adresa
Pohlaví osoby
Oblast New Yorku
Hodnota dolaru

Příkaz join pracuje s „polemi“, což v tomto kontextu znamená část textu ohraničenou mezerami, začátek řádku nebo konec řádku. Aby spojení odpovídalo řádkům mezi dvěma soubory, musí každý řádek obsahovat společné pole.

Pole tedy můžeme porovnat pouze v případě, že se vyskytuje v obou souborech. IP adresa se objevuje pouze v jednom souboru, takže to není dobré. Křestní jméno se objevuje pouze v jednom souboru, takže ani to nemůžeme použít. Příjmení je v obou souborech, ale byla by to špatná volba, protože různí lidé mají stejné příjmení.

  Jak spustit Linux na Androidu s nasazením Linuxu

Data také nemůžete spojit s mužskými a ženskými údaji, protože jsou příliš vágní. Oblasti New Yorku a dolarové hodnoty se také objevují pouze v jednom souboru.

Můžeme však použít e-mailovou adresu, protože je přítomna v obou souborech a každý je jedinečný pro jednotlivce. Rychlý pohled na soubory také potvrdí, že řádky v každém odpovídají stejné osobě, takže můžeme použít čísla řádků jako pole, která se mají shodovat (později použijeme jiné pole).

Všimněte si, že v obou souborech je různý počet polí, což je v pořádku – z každého souboru můžeme říci, které pole se má spojit.

Dávejte si však pozor na pole, jako jsou regiony New Yorku; v souboru odděleném mezerami vypadá každé slovo v názvu oblasti jako pole. Protože některé oblasti mají dvou- nebo tříslovné názvy, máte ve skutečnosti různý počet polí ve stejném souboru. To je v pořádku, pokud se shodujete v polích, která se objeví v řádku před regiony New York.

Příkaz připojit

Nejprve je třeba seřadit pole, které chcete porovnat. V obou souborech máme vzestupná čísla, takže tato kritéria splňujeme. Ve výchozím nastavení spojení používá první pole v souboru, což je to, co chceme. Další rozumné výchozí nastavení je, že join očekává, že oddělovače polí budou prázdné. Opět to máme, takže můžeme pokračovat a připojit se.

Protože používáme všechna výchozí nastavení, náš příkaz je jednoduchý:

join file-1.txt file-2.txt

The

join považuje soubory za „soubor jedna“ a „soubor dva“ podle pořadí, ve kterém jsou uvedeny na příkazovém řádku.

Výstup je následující:

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

Výstup je naformátován následujícím způsobem: Nejprve se vytiskne pole, na kterém byly řádky spárovány, následují další pole ze souboru jedna a poté pole ze souboru dva bez pole shody.

Netříděná pole

Zkusme něco, o čem víme, že nebude fungovat. Umístíme řádky do jednoho souboru mimo pořadí, takže spojení nebude schopno soubor zpracovat správně. Obsah souboru-3.txt je stejný jako obsah souboru-2.txt, ale řádek osm je mezi řádky pět a šest.

  Jak nainstalovat Linux

Níže je uveden obsah souboru-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

Zadáme následující příkaz, abychom se pokusili připojit soubor-3.txt k souboru-1.txt:

join file-1.txt file-3.txt

The

join hlásí, že sedmý řádek v souboru-3.txt je mimo provoz, takže není zpracován. Řádek sedm je ten, který začíná číslem šest, které by mělo být ve správně seřazeném seznamu před osmou. Šestý řádek v souboru (který začíná „8 Odell“) byl poslední zpracovaný, takže vidíme jeho výstup.

Můžete použít možnost –check-order, pokud chcete zjistit, zda je spojení spokojeno s pořadím řazení souborů – nebude se snažit o sloučení.

Za tímto účelem zadáme následující:

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

The

join vám předem říká, že bude problém s řádkem sedm souboru file-3.txt.

Soubory s chybějícími řádky

V souboru-4.txt byl odstraněn poslední řádek, takže tam není řádek osm. Obsah je následující:

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

Napíšeme následující a, překvapivě, join si nestěžuje a zpracuje všechny řádky, které může:

join file-1.txt file-4.txt

The

Výstup uvádí sedm sloučených řádků.

Volba -a (print unpairable) říká, že spojení má také vytisknout řádky, které nelze spárovat.

Zde napíšeme následující příkaz, který spoji přikáže vytisknout řádky ze souboru jedna, které nelze přiřadit řádkům v souboru dva:

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

The

Sedm řádků se shoduje a řádek osm ze souboru jedna se vytiskne bez shody. Nejsou zde žádné sloučené informace, protože soubor-4.txt neobsahoval řádek osm, ke kterému by se dal přiřadit. Nicméně alespoň se stále zobrazuje ve výstupu, takže víte, že nemá shodu v souboru-4.txt.

Zadáme následující příkaz -v (potlačit spojené řádky), abychom odhalili všechny řádky, které nemají shodu:

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

The

Vidíme, že řádek osm je jediný, který nemá shodu v souboru dva.

Odpovídající ostatním polím

Pojďme spárovat dva nové soubory v poli, které není výchozí (pole jedna). Níže je uveden obsah souboru-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

A následující je obsah souboru-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

Jediné rozumné pole pro připojení je e-mailová adresa, což je pole jedna v prvním souboru a pole dva ve druhém. Abychom tomu vyhověli, můžeme použít volby -1 (soubor jedno pole) a -2 (soubor dvě pole). Za nimi následuje číslo, které označuje, které pole v každém souboru by se mělo použít pro spojení.

  Jak sloučit soubory PDF s PDFSam v systému Linux

Zadáme následující, abychom spojení řekli, aby použilo první pole v souboru jedna a druhé v souboru dva:

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

The

Soubory jsou spojeny na e-mailové adrese, která se zobrazí jako první pole každého řádku ve výstupu.

Použití různých oddělovačů polí

Co když máte soubory s poli, která jsou oddělena něčím jiným než mezerami?

Následující dva soubory jsou odděleny čárkami – jediné mezery jsou mezi víceslovnými názvy míst:

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

Obsah

Můžeme použít -t (znak oddělovače), abychom sdělili join, který znak použít jako oddělovač pole. V tomto případě je to čárka, takže zadáme následující příkaz:

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

The

Všechny řádky se shodují a v názvech míst jsou zachovány mezery.

Ignorování písmene Case

Další soubor, soubor-9.txt, je téměř totožný se souborem-8.txt. Jediný rozdíl je v tom, že některé e-mailové adresy mají velké písmeno, jak je uvedeno níže:

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

Když jsme spojili soubor-7.txt a soubor-8.txt, fungovalo to perfektně. Podívejme se, co se stane s file-7.txt a file-9.txt.

Zadáme následující příkaz:

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

The

Shodovali jsme pouze šest linek. Rozdíly ve velkých a malých písmenech zabránily spojení dalších dvou e-mailových adres.

Můžeme však použít volbu -i (ignorovat velká a malá písmena) k vynucení spojení, aby se ignorovaly ty rozdíly a odpovídající pole, která obsahují stejný text, bez ohledu na velikost písmen.

Zadáme následující příkaz:

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

The

Všech osm řádků je spárováno a úspěšně spojeno.

Mix and Match

Když se potýkáte s nepohodlnou přípravou dat, máte mocného spojence. Možná potřebujete analyzovat data, nebo se je možná pokoušíte vmasírovat do tvaru, abyste provedli import do jiného systému.

Bez ohledu na to, jaká je situace, budete rádi, že se zapojíte do svého koutku!