Як використовувати команду приєднання в Linux

Якщо ви хочете об’єднати дані з двох текстових файлів, зіставивши загальне поле, ви можете скористатися командою приєднання Linux. Це додає крапку динамізму вашим статичним файлам даних. Ми покажемо вам, як ним користуватися.

Збіг даних у файлах

Дані — король. Корпорації, підприємства та домогосподарства однаково працюють на цьому. Але дані, які зберігаються в різних файлах і збираються різними людьми, — це біль. Крім того, що ви знаєте, які файли відкривати, щоб знайти потрібну інформацію, макет і формат файлів можуть відрізнятися.

Вам також доведеться мати справу з адміністративним головним болем щодо того, які файли потрібно оновити, які потрібно створити резервну копію, які є застарілими, а які можна архівувати.

Крім того, якщо вам потрібно консолідувати свої дані або провести деякий аналіз усього набору даних, у вас є додаткова проблема. Як ви раціоналізуєте дані в різних файлах, перш ніж ви зможете зробити з ними те, що вам потрібно? Як ви підходите до етапу підготовки даних?

Хороша новина полягає в тому, що якщо файли мають принаймні один загальний елемент даних, команда Linux join може витягнути вас із багно.

Файли даних

Усі дані, які ми будемо використовувати для демонстрації використання команди приєднання, є вигаданими, починаючи з наступних двох файлів:

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

Зміст

Нижче наведено вміст файлу-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

У нас є набір пронумерованих рядків, і кожен рядок містить всю наступну інформацію:

Число
Ім’я
Прізвище
Адреса електронної пошти
Стать людини
IP-адреса

Нижче наведено вміст файлу-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

Кожен рядок у файлі-2.txt містить таку інформацію:

Число
Прізвище
Адреса електронної пошти
Стать людини
Регіон Нью-Йорка
Вартість в доларах

Команда приєднання працює з «полями», які в даному контексті означає ділянку тексту, оточений пробілами, початок рядка або кінець рядка. Щоб об’єднання відповідало рядкам між двома файлами, кожен рядок повинен містити спільне поле.

Таким чином, ми можемо зіставити поле, лише якщо воно є в обох файлах. IP-адреса відображається лише в одному файлі, тому це не добре. Перше ім’я з’являється лише в одному файлі, тому ми також не можемо його використовувати. Прізвище є в обох файлах, але це був би поганий вибір, оскільки різні люди мають однакове прізвище.

  Як грати в Yooka-Laylee на Linux

Ви також не можете пов’язувати дані разом із чоловічими та жіночими записами, оскільки вони занадто розпливчасті. Регіони Нью-Йорка та значення долара також відображаються лише в одному файлі.

Однак ми можемо використовувати адресу електронної пошти, оскільки вона присутня в обох файлах, і кожен є унікальним для окремої людини. Швидкий перегляд файлів також підтверджує, що рядки в кожному з них відповідають одній і тій же людині, тому ми можемо використовувати номери рядків як наше поле для відповідності (згодом ми використаємо інше поле).

Зауважте, що в двох файлах є різна кількість полів, і це нормально — ми можемо вказати join, яке поле використовувати з кожного файлу.

Однак остерігайтеся таких полів, як регіони Нью-Йорка; у файлі, розділеному пробілом, кожне слово в назві регіону виглядає як поле. Оскільки деякі регіони мають назви з двох або трьох слів, насправді ви маєте різну кількість полів у одному файлі. Це нормально, якщо ви збігаєте поля, які з’являються в рядку перед регіонами Нью-Йорка.

Команда приєднання

По-перше, поле, яке ви збираєтеся знайти, має бути відсортовано. Ми маємо зростаючі числа в обох файлах, тому ми відповідаємо цим критеріям. За замовчуванням, join використовує перше поле у ​​файлі, що ми і хочемо. Іншим розумним за замовчуванням є те, що приєднання очікує, що роздільники полів будуть пробілами. Знову ж таки, ми маємо це, тож ми можемо продовжити і приєднатися.

Оскільки ми використовуємо всі значення за замовчуванням, наша команда проста:

join file-1.txt file-2.txt

The

join розглядає файли як «файл один» і «файл два» відповідно до порядку, в якому вони перераховані в командному рядку.

Вихід виглядає наступним чином:

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

Вихід форматується наступним чином: спочатку друкується поле, у якому були зіставлені рядки, потім інші поля з файлу один, а потім поля з файлу два без поля відповідності.

  4 найкращих зовнішніх твердотільних накопичувача для користувачів Linux на вибір у 2021 році

Невідсортовані поля

Давайте спробуємо щось, про що ми знаємо, що не вийде. Ми помістимо рядки в одному файлі з ладу, тому join не зможе правильно обробити файл. Вміст файлу-3.txt такий самий, як і файл-2.txt, але восьмий рядок знаходиться між п’ятим і шостим рядками.

Нижче наведено вміст файлу-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

Ми вводимо таку команду, щоб спробувати приєднатися до файлу-3.txt до файлу-1.txt:

join file-1.txt file-3.txt

The

join повідомляє, що сьомий рядок у файлі-3.txt не працює, тому він не обробляється. Рядок сьомий — це той, що починається з цифри шість, яка має стояти перед вісьмою у правильно відсортованому списку. Шостий рядок у файлі (який починається з «8 Odell») був останнім обробленим, тому ми бачимо для нього вихідні дані.

Ви можете скористатися опцією –check-order, якщо хочете перевірити, чи задоволені приєднання порядком сортування файлів – спроби об’єднання не будуть.

Для цього вводимо наступне:

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

The

join заздалегідь повідомляє, що виникне проблема з сьомим рядком файлу file-3.txt.

Файли з відсутніми рядками

У файлі-4.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

Ми вводимо наступне і, на диво, join не скаржиться і обробляє всі рядки, які може:

join file-1.txt file-4.txt

The

Вихідні дані містять сім об’єднаних рядків.

Параметр -a (друк непарний) вказує об’єднанню також надрукувати рядки, які не можна знайти.

Тут ми вводимо таку команду, щоб сповістити join надрукувати рядки з файлу 1, які не можуть бути зіставлені з рядками у другому файлі:

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

The

Сім рядків узгоджено, а рядок вісім із файлу один надруковано без відповідності. Немає жодної об’єднаної інформації, оскільки файл-4.txt не містив восьмого рядка, до якого можна було б зіставити його. Однак, принаймні, він все ще відображається у виводі, щоб ви знали, що він не має відповідності у файлі-4.txt.

Ми вводимо таку команду -v (придушити з’єднані рядки), щоб виявити будь-які рядки, які не мають збігу:

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

The

Ми бачимо, що восьмий рядок є єдиним, який не має збігу у другому файлі.

  Як захистити інсталяцію Linux: основи

Збіг інших полів

Давайте зіставимо два нові файли в полі, яке не є стандартним (поле перше). Нижче наведено вміст файлу-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

Нижче наведено вміст файлу-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

Єдиним розумним полем для приєднання є адреса електронної пошти, яка є полем першим у першому файлі та полем другим у другому. Щоб врахувати це, ми можемо використовувати параметри -1 (файл в одному полі) і -2 (файл у два поля). За ними ми вказуємо число, яке вказує, яке поле в кожному файлі слід використовувати для приєднання.

Ми вводимо наступне, щоб повідомити join використовувати перше поле у ​​першому файлі, а друге у файлі два:

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

The

Файли об’єднуються за адресою електронної пошти, яка відображається як перше поле кожного рядка у виводі.

Використання різних роздільників полів

Що робити, якщо у вас є файли з полями, розділеними чимось іншим, ніж пробіли?

Наступні два файли розділені комами — єдиний пробіл між назвами місць із кількох слів:

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

Зміст

Ми можемо використовувати -t (символ роздільника), щоб вказати об’єднанню, який символ використовувати як роздільник полів. У цьому випадку це кома, тому ми вводимо таку команду:

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

The

Усі рядки збігаються, а пробіли збережені в назвах місць.

Ігнорування регістру літер

Інший файл, file-9.txt, майже ідентичний 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

Коли ми об’єднали файли-7.txt і file-8.txt, це працювало ідеально. Давайте подивимося, що станеться з файлами-7.txt і file-9.txt.

Вводимо таку команду:

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

The

Ми зіставили лише шість рядків. Різниця у великих і малих літерах не дозволила об’єднати дві інші адреси електронної пошти.

Однак ми можемо використовувати параметр -i (ігнорувати регістр), щоб примусово ігнорувати ці відмінності та відповідати полям, які містять однаковий текст, незалежно від регістру.

Вводимо таку команду:

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

The

Усі вісім рядків зіставлені та успішно з’єднані.

Змішайте та поєднайте

У приєднанні у вас є потужний союзник, коли ви боретеся з незручною підготовкою даних. Можливо, вам потрібно проаналізувати дані, або, можливо, ви намагаєтеся привести їх у форму, щоб виконати імпорт в іншу систему.

Незалежно від ситуації, ви будете раді, що приєдналися у своєму кутку!