Jak korzystać z polecenia join w systemie Linux

Jeśli chcesz scalić dane z dwóch plików tekstowych przez dopasowanie wspólnego pola, możesz użyć polecenia dołączenia w systemie Linux. Dodaje odrobinę dynamizmu do statycznych plików danych. Pokażemy Ci, jak z niego korzystać.

Dopasowywanie danych w plikach

Dane są królem. Działają na nim zarówno korporacje, firmy, jak i gospodarstwa domowe. Ale dane przechowywane w różnych plikach i zestawiane przez różne osoby są uciążliwe. Oprócz wiedzy, które pliki należy otworzyć, aby znaleźć żądane informacje, układ i format plików mogą być różne.

Musisz także poradzić sobie z administracyjnym bólem głowy związanym z tym, które pliki wymagają aktualizacji, które należy zarchiwizować, które są starsze, a które można zarchiwizować.

Dodatkowo, jeśli musisz skonsolidować dane lub przeprowadzić analizę całego zestawu danych, masz dodatkowy problem. W jaki sposób zracjonalizujesz dane w różnych plikach, zanim będziesz mógł zrobić z nimi to, co musisz? Jak podchodzisz do fazy przygotowania danych?

Dobrą wiadomością jest to, że jeśli pliki mają co najmniej jeden wspólny element danych, polecenie dołączenia Linuksa może wyciągnąć cię z błota.

Pliki danych

Wszystkie dane, których użyjemy do zademonstrowania użycia polecenia join są fikcyjne, zaczynając od następujących dwóch plików:

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

Zawartość

Poniżej znajduje się zawartość pliku-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

Mamy zestaw ponumerowanych linii, a każda linia zawiera wszystkie następujące informacje:

Numer
Imię
Nazwisko
Adres e-mail
Płeć osoby
Adres IP

Poniżej znajduje się zawartość pliku-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żdy wiersz w pliku-2.txt zawiera następujące informacje:

Numer
Nazwisko
Adres e-mail
Płeć osoby
Region Nowego Jorku
Wartość w dolarach

Polecenie join działa z „polami”, które w tym kontekście oznaczają fragment tekstu otoczony białymi znakami, początek wiersza lub koniec wiersza. Aby sprzężenie pasowało do wierszy między dwoma plikami, każdy wiersz musi zawierać wspólne pole.

Dlatego możemy dopasować tylko pole, jeśli występuje w obu plikach. Adres IP pojawia się tylko w jednym pliku, więc to niedobrze. Imię pojawia się tylko w jednym pliku, więc też nie możemy go użyć. Nazwisko znajduje się w obu plikach, ale byłby to zły wybór, ponieważ różne osoby mają to samo nazwisko.

Nie możesz też powiązać danych z wpisami męskimi i żeńskimi, ponieważ są one zbyt niejasne. Regiony Nowego Jorku i wartości w dolarach pojawiają się również tylko w jednym pliku.

Możemy jednak użyć adresu e-mail, ponieważ znajduje się on w obu plikach i każdy jest unikalny dla osoby. Szybkie przejrzenie plików potwierdza również, że wiersze w każdym z nich odpowiadają tej samej osobie, więc możemy użyć numerów wierszy jako naszego pola do dopasowania (później użyjemy innego pola).

Zauważ, że w tych dwóch plikach jest różna liczba pól, co jest w porządku – z każdego pliku możemy określić, które pole ma być użyte.

Uważaj jednak na pola, takie jak regiony Nowego Jorku; w pliku rozdzielanym spacjami każde słowo w nazwie regionu wygląda jak pole. Ponieważ niektóre regiony mają nazwy składające się z dwóch lub trzech słów, w rzeczywistości masz różną liczbę pól w tym samym pliku. Jest to w porządku, o ile dopasujesz pola, które pojawiają się w wierszu przed regionami Nowego Jorku.

Polecenie łączenia

Po pierwsze, pole, które zamierzasz dopasować, musi zostać posortowane. W obu plikach mamy rosnące liczby, więc spełniamy te kryteria. Domyślnie sprzężenie używa pierwszego pola w pliku, czyli tego, czego potrzebujemy. Inną rozsądną wartością domyślną jest to, że łączenie oczekuje, że separatory pól będą białymi znakami. Ponownie, mamy to, więc możemy iść dalej i uruchomić dołączenie.

Ponieważ używamy wszystkich wartości domyślnych, nasze polecenie jest proste:

join file-1.txt file-2.txt

Plik

join traktuje te pliki jako „plik pierwszy” i „plik drugi” zgodnie z kolejnością, w jakiej są wymienione w wierszu poleceń.

Wynik jest następujący:

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

Wynik jest formatowany w następujący sposób: Najpierw drukowane jest pole, na którym zostały dopasowane wiersze, a następnie pozostałe pola z pliku pierwszego, a następnie pola z pliku drugiego bez pola dopasowania.

Niesortowane pola

Spróbujmy czegoś, o czym wiemy, że nie zadziała. Umieścimy wiersze w jednym pliku w niewłaściwej kolejności, aby funkcja Join nie mogła poprawnie przetworzyć pliku. Zawartość pliku-3.txt jest taka sama, jak plik-2.txt, ale linia ósma znajduje się między wierszami piątej i szóstej.

Poniżej znajduje się zawartość pliku-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

Wpisujemy następujące polecenie, aby spróbować dołączyć plik-3.txt do pliku-1.txt:

join file-1.txt file-3.txt

Plik

join zgłasza, że ​​siódma linia w file-3.txt jest niesprawna, więc nie jest przetwarzana. Linia siódma to ta, która zaczyna się od cyfry sześć, która powinna znajdować się przed ósmą na prawidłowo posortowanej liście. Szósta linia w pliku (która zaczyna się od „8 Odell”) była ostatnią przetworzoną, więc widzimy dla niej wynik.

Możesz użyć opcji –check-order, jeśli chcesz sprawdzić, czy join jest zgodne z porządkiem sortowania plików – nie zostanie podjęta próba scalenia.

Aby to zrobić, wpisujemy:

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

Plik

join informuje z góry, że wystąpi problem z linią siódmą pliku file-3.txt.

Pliki z brakującymi wierszami

W pliku-4.txt ostatnia linia została usunięta, więc nie ma linii ósmej. Zawartość jest następująca:

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

Piszemy co następuje i, co zaskakujące, join nie narzeka i przetwarza wszystkie możliwe wiersze:

join file-1.txt file-4.txt

Plik

Dane wyjściowe zawierają siedem połączonych wierszy.

Opcja -a (print unpaiable) nakazuje join również wypisać wiersze, których nie można dopasować.

W tym miejscu wpisujemy następujące polecenie, aby polecić złączu wypisanie wierszy z pliku pierwszego, których nie można dopasować do wierszy w pliku drugim:

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

Plik

Siedem wierszy jest dopasowanych, a linia ósma z pierwszego pliku jest drukowana, bez dopasowania. Nie ma żadnych scalonych informacji, ponieważ plik-4.txt nie zawierał linii ósmej, do której mógłby zostać dopasowany. Jednak przynajmniej nadal pojawia się na wyjściu, więc wiesz, że nie ma dopasowania w pliku-4.txt.

Wpisujemy następujące polecenie -v (pomijanie połączonych linii), aby wyświetlić wszystkie linie, które nie pasują:

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

Plik

Widzimy, że linia ósma jest jedyną, która nie ma dopasowania w pliku drugim.

Dopasowywanie innych pól

Dopasujmy dwa nowe pliki w polu, które nie jest domyślne (pole pierwsze). Poniżej znajduje się zawartość pliku-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 oto zawartość pliku-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

Jedynym sensownym polem do dołączenia jest adres e-mail, czyli pierwsze pole w pierwszym pliku i drugie pole w drugim. Aby to uwzględnić, możemy użyć opcji -1 (plik jedno pole) i -2 (plik dwa pola). Następnie podamy liczbę wskazującą, które pole w każdym pliku powinno być użyte do łączenia.

Wpisujemy następujące polecenie, aby polecenie join użyło pierwszego pola w pliku pierwszym, a drugiego w pliku drugim:

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

Plik

Pliki są łączone na adres e-mail, który jest wyświetlany jako pierwsze pole każdego wiersza w wynikach.

Używanie różnych separatorów pól

A co, jeśli masz pliki z polami oddzielonymi czymś innym niż białe znaki?

Poniższe dwa pliki są rozdzielane przecinkami – jedyna spacja znajduje się między nazwami miejsc składającymi się z wielu słów:

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

Zawartość

Możemy użyć -t (znak separatora), aby wskazać złączu, którego znaku użyć jako separatora pól. W tym przypadku jest to przecinek, więc wpisujemy następujące polecenie:

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

Plik

Wszystkie wiersze są dopasowane, a spacje są zachowane w nazwach miejsc.

Ignorowanie wielkości liter

Inny plik, file-9.txt, jest prawie identyczny z file-8.txt. Jedyną różnicą jest to, że niektóre adresy e-mail mają wielką literę, jak pokazano poniżej:

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

Kiedy dołączyliśmy do file-7.txt i file-8.txt, działało idealnie. Zobaczmy, co się stanie z file-7.txt i file-9.txt.

Wpisujemy następujące polecenie:

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

Plik

Dopasowaliśmy tylko sześć linii. Różnice w dużych i małych literach uniemożliwiły połączenie pozostałych dwóch adresów e-mail.

Możemy jednak użyć opcji -i (ignoruj ​​wielkość liter), aby wymusić złączenie w celu zignorowania tych różnic i dopasowania pól zawierających ten sam tekst, niezależnie od wielkości liter.

Wpisujemy następujące polecenie:

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

Plik

Wszystkie osiem linii jest dopasowanych i pomyślnie połączonych.

Mieszać i łączyć

W złączeniu masz potężnego sojusznika, gdy zmagasz się z niezręcznym przygotowywaniem danych. Być może musisz przeanalizować dane, a może próbujesz nadać im kształt, aby wykonać import do innego systemu.

Bez względu na sytuację, będziesz zadowolony, że dołączyłeś do swojego kąta!