Как использовать команду join в Linux

Подсказка терминала, готовая для команды в системе Linux.

Фатмавати Ахмад Дзэнури / Shutterstock



Если вы хотите объединить данные из двух текстовых файлов, сопоставив общее поле, вы можете использовать Linux join команда. Это добавляет динамизма вашим статическим файлам данных. Мы покажем вам, как им пользоваться.

Сопоставление данных в файлах

Данные - это король. На нем в равной степени работают корпорации, предприятия и домашние хозяйства. Но данные, хранящиеся в разных файлах и сопоставленные разными людьми, - это проблема. Помимо того, что вы знаете, какие файлы открывать для поиска нужной информации, их макет и формат могут отличаться.





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

Кроме того, если вам нужно консолидировать данные или провести анализ всего набора данных, у вас возникнет дополнительная проблема. Как вы рационализируете данные в разных файлах, прежде чем сможете делать с ними то, что вам нужно? Как вы подходите к этапу подготовки данных?



Хорошей новостью является то, что файлы имеют хотя бы один общий элемент данных, Linux join Команда может вытащить вас из трясины.

Файлы данных

Все данные мы будем использовать для демонстрации использования join Команда является вымышленной, начиная со следующих двух файлов:

file-1.txt file-2.txt



Ниже приводится содержимое file-2.txt:

joinРеклама

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

    Число Имя Фамилия Адрес электронной почты Пол человека IP-адрес

Ниже приводится содержимое join:

join

Каждая строка в join содержит следующую информацию:

    Число Фамилия Адрес электронной почты Пол человека Район Нью-Йорка Стоимость в долларах

join Команда работает с полями, что в данном контексте означает раздел текста, окруженный пробелами, начало или конец строки. Для join чтобы сопоставить строки между двумя файлами, каждая строка должна содержать общее поле.

Следовательно, мы можем сопоставить поле, только если оно присутствует в обоих файлах. IP-адрес появляется только в одном файле, так что это бесполезно. Имя появляется только в одном файле, поэтому мы не можем его использовать. Фамилия есть в обоих файлах, но это будет плохой выбор, поскольку у разных людей одна и та же фамилия.

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

Однако мы можем использовать адрес электронной почты, потому что он присутствует в обоих файлах, и каждый из них уникален для каждого человека. Быстрый просмотр файлов также подтверждает, что строки в каждой соответствуют одному и тому же человеку, поэтому мы можем использовать номера строк в качестве поля для сопоставления (позже мы будем использовать другое поле).

Реклама

Обратите внимание, что в двух файлах разное количество полей, и это нормально - мы можем сказать join какое поле использовать из каждого файла.

Тем не менее, остерегайтесь таких областей, как Нью-Йорк; в файле, разделенном пробелами, каждое слово в названии региона выглядит как поле. Поскольку названия некоторых регионов состоят из двух или трех слов, в одном файле фактически разное количество полей. Это нормально, если вы сопоставляете поля, которые появляются в строке перед регионами Нью-Йорка.

Команда соединения

Во-первых, поле, которое вы собираетесь сопоставить, должно быть отсортировано. В обоих файлах есть возрастающие числа, поэтому мы соответствуем этому критерию. По умолчанию join использует первое поле в файле, что нам и нужно. Другое разумное значение по умолчанию - file-3.txt ожидает, что разделители полей будут пробелами. Опять же, у нас это есть, так что мы можем продолжить и запустить file-2.txt.

Поскольку мы используем все значения по умолчанию, наша команда проста:

file-3.txt

file-3.txt считает файлы первым и вторым в соответствии с порядком, в котором они указаны в командной строке.

Результат выглядит следующим образом:

file-1.txt

Вывод форматируется следующим образом: сначала печатается поле, в котором были сопоставлены строки, за ним следуют другие поля из файла 1, а затем поля из файла 2 без поля сопоставления.

Несортированные поля

Давай попробуем что-нибудь, что, как мы знаем, не сработает. Мы будем размещать строки в одном файле не по порядку, поэтому join не сможет правильно обработать файл. Содержимое file-3.txt такие же, как --check-order, но восьмая строка находится между пятой и шестой строками.

Ниже приводится содержимое join:

joinРеклама

Мы вводим следующую команду, чтобы попытаться присоединиться к file-3.txt к file-4.txt:

join

-a сообщает, что седьмая строка в join вышла из строя, поэтому не обрабатывается. Седьмая строка начинается с числа шесть, которое должно стоять перед восьмью в правильно отсортированном списке. Шестая строка в файле (которая начинается с 8 Odell) была обработана последней, поэтому мы видим результат для нее.

Вы можете использовать join вариант, если вы хотите узнать, file-4.txt доволен порядком сортировки файлов - попытки слияния предприниматься не будут.

Для этого набираем следующее:

file-4.txt

-v заранее сообщает, что возникнет проблема с седьмой строкой файла -1.

Файлы с пропущенными строками

В -2 последняя строка была удалена, поэтому восьмой строки нет. Содержимое выглядит следующим образом:

joinРеклама

Мы набираем следующее и, что удивительно, -t не жалуется и обрабатывает все строки, которые может:

join

В выводе перечислены семь объединенных строк.

file-9.txt (печатать нежелательные) опция сообщает file-8.txt чтобы также напечатать строки, которые не удалось сопоставить.

Здесь мы вводим следующую команду, чтобы сообщить file-7.txt чтобы напечатать строки из первого файла, которые не могут быть сопоставлены со строками во втором файле:

file-8.txt

Семь строк совпадают, а восьмая строка из первого файла печатается без совпадений. Нет объединенной информации, потому что file-7.txt не содержал восьмой строки, с которой он мог бы быть сопоставлен. Однако, по крайней мере, он по-прежнему отображается в выводе, поэтому вы знаете, что ему нет совпадений в file-9.txt.

Набираем следующее -i (подавить соединенные строки), чтобы показать строки, у которых нет совпадений:

join

Мы видим, что восьмая строка - единственная, которой нет совпадений во втором файле.

Соответствие другим полям

Давайте сопоставим два новых файла в поле, которое не является значением по умолчанию (первое поле). Ниже приводится содержимое файла-7.txt:

join

А вот содержимое файла-8.txt:

joinРеклама

Единственное разумное поле, которое можно использовать для присоединения, - это адрес электронной почты, который является первым полем в первом файле и вторым полем во втором. Чтобы приспособиться к этому, мы можем использовать

cat file-1.txt
(заполнить одно поле) и
cat file-2.txt
(файл два поля) варианты. За ними будет стоять число, указывающее, какое поле в каждом файле следует использовать для присоединения.

Мы набираем следующее, чтобы сообщить

1 Adore Varian avarian0@newyorker.com Female 192.57.150.231 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 8 Odell Jursch ojursch7@utexas.edu Male 1.138.85.117
использовать первое поле в первом файле и второе во втором файле:

1 Varian avarian0@newyorker.com Female Western New York 5,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes 9,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier 1,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York 5,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country 6,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley 6,733.78 7 Standen ustanden6@geocities.jp Female Capital District 4,634.93 8 Jursch ojursch7@utexas.edu Male Hudson Valley 3,821.09

Файлы объединяются по адресу электронной почты, который отображается в качестве первого поля каждой строки вывода.

Использование разных разделителей полей

Что делать, если у вас есть файлы с полями, разделенными чем-то другим, кроме пробелов?

Следующие два файла разделены запятыми - единственный пробел между названиями мест, состоящими из нескольких слов:

join file-1.txt file-2.txt
1 Adore Varian avarian0@newyorker.com Female 192.57.150.231 Varian avarian0@newyorker.com Female Western New York 5,304.73 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 Merrell nmerrell1@ted.com Female Finger Lakes 9,033.10 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 Friett hfriett2@dagondesign.com Female Southern Tier 1,664.44 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 Venmore tvenmore3@gmpg.org Female Central New York 5,818.02 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 Sealeaf dsealeaf4@nps.gov Female North Country 6,690.15 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 Bezley fbezley5@lulu.com Male Mohawk Valley 6,733.78 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 Standen ustanden6@geocities.jp Female Capital District 4,634.93 8 Odell Jursch ojursch7@utexas.edu Male 1.138.85.117 Jursch ojursch7@utexas.edu Male Hudson Valley 3,821.09

Реклама

Мы можем использовать

1 Varian avarian0@newyorker.com Female Western New York 5,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes 9,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier 1,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York 5,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country 6,690.15 8 Jursch ojursch7@utexas.edu Male Hudson Valley 3,821.09 6 Bezley fbezley5@lulu.com Male Mohawk Valley 6,733.78 7 Standen ustanden6@geocities.jp Female Capital District 4,634.93
(символ-разделитель), чтобы сообщить
join file-1.txt file-3.txt
какой символ использовать в качестве разделителя полей. В данном случае это запятая, поэтому мы набираем следующую команду:

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

Все строки совпадают, а пробелы сохраняются в названиях мест.

Игнорирование регистра букв

Другой файл,

1 Varian avarian0@newyorker.com Female Western New York 5,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes 9,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier 1,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York 5,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country 6,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley 6,733.78 7 Standen ustanden6@geocities.jp Female Capital District 4,634.93
, почти идентичен
join file-1.txt file-4.txt
. Единственное отличие состоит в том, что некоторые адреса электронной почты имеют заглавную букву, как показано ниже:

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

Когда мы присоединились к

join -v file-1.txt file-4.txt
и
avarian0@newyorker.com Female 192.57.150.231 dsealeaf4@nps.gov Female 210.53.81.212 fbezley5@lulu.com Male 72.173.218.75 hfriett2@dagondesign.com Female 33.167.32.89 nmerrell1@ted.com Female 22.198.121.181 ojursch7@utexas.edu Male 1.138.85.117 tvenmore3@gmpg.org Female 251.9.204.115 ustanden6@geocities.jp Female 4.204.0.237
, он работал отлично. Посмотрим, что произойдет с
Female avarian0@newyorker.com Western New York 5,304.73 Female dsealeaf4@nps.gov North Country 6,690.15 Male fbezley5@lulu.com Mohawk Valley 6,733.78 Female hfriett2@dagondesign.com Southern Tier 1,664.44 Female nmerrell1@ted.com Finger Lakes 9,033.10 Male ojursch7@utexas.edu Hudson Valley 3,821.09 Female tvenmore3@gmpg.org Central New York 5,818.02 Female ustanden6@geocities.jp Capital District 4,634.93
и
join -1 1 -2 2 file-7.txt file-8.txt
.

Набираем следующую команду:

cat file-5.txt

Мы сопоставили только шесть строк. Различия в прописных и строчных буквах не позволяли объединить два других адреса электронной почты.

Реклама

Однако мы можем использовать

cat file-6.txt
(игнорировать регистр) параметр для принудительной установки
join -t, file-5.txt file-6.txt
игнорировать эти различия и сопоставить поля, содержащие один и тот же текст, независимо от регистра.

Набираем следующую команду:

Female avarian0@newyorker.com Western New York 5,304.73 Female dsealeaf4@nps.gov North Country 6,690.15 Male Fbezley5@lulu.com Mohawk Valley 6,733.78 Female hfriett2@dagondesign.com Southern Tier 1,664.44 Female nmerrell1@ted.com Finger Lakes 9,033.10 Male Ojursch7@utexas.edu Hudson Valley 3,821.09 Female tvenmore3@gmpg.org Central New York 5,818.02 Female ustanden6@geocities.jp Capital District 4,634.93

Все восемь линий совпадают и успешно соединяются.

Смешивать и сочетать

В

join -1 1 -2 2 file-7.txt file-9.txt
у вас есть мощный союзник, когда вы боретесь с неудобной подготовкой данных. Возможно, вам нужно проанализировать данные или вы пытаетесь придать им форму, чтобы выполнить импорт в другую систему.

Независимо от ситуации, вы будете рады, что у вас есть

join -1 1 -2 2 -i file-7.txt file-9.txt
в твоем углу!

Команды Linux
Файлы деготь · pv · Кот · такс · chmod · рукоятка · разница · sed · С участием · человек · толкать · popd · fsck · тестовый диск · seq · fd · пандок · компакт диск · $ ПУТЬ · awk · присоединиться · jq · складывать · уникальный · journalctl · хвостик · государство · ls · fstab · выбросил · меньше · chgrp · Chown · rev · Посмотрите · струны · тип · переименовать · застегивать · распаковать · устанавливать · размонтировать · установить · fdisk · mkfs · rm · rmdir · rsync · df · gpg · мы · нано · mkdir · от · пер · пластырь · конвертировать · rclone · крошить · SRM
Процессы псевдоним · экран · верхняя · Ницца · Ренис · прогресс · Strace · система · tmux · чш · история · в · партия · бесплатно · который · dmesg · usermod · пс · chroot · xargs · tty · мизинец · lsof · vmstat · тайм-аут · стена · да · убийство · спать · судо · его · время · groupadd · usermod · группы · lshw · неисправность · перезагружать · останавливаться · выключение · пароль · lscpu · crontab · Дата · bg · фг
Сети netstat · пинг · трассировка · ip · SS · кто · fail2ban · бмон · ты · Палец · nmap · ftp · завиток · wget · ВОЗ · кто я · В · iptables · ssh-keygen · ufw

СВЯЗАННЫЙ: Лучшие ноутбуки с Linux для разработчиков и энтузиастов

ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ Фотография профиля Дэйва Маккея Дэйв Маккей
Дэйв Маккей впервые использовал компьютеры, когда в моде была перфолента, и с тех пор он занимается программированием. Проработав более 30 лет в ИТ-индустрии, он теперь работает журналистом в области информационных технологий. За свою карьеру он работал программистом-фрилансером, менеджером международной группы разработчиков программного обеспечения, менеджером проекта ИТ-услуг, а в последнее время - специалистом по защите данных. Его статьи были опубликованы на сайтах howtogeek.com, cloudsavvyit.com, itenterpriser.com и opensource.com. Дэйв - евангелист Linux и сторонник открытого исходного кода.
Прочитать полную биографию

Интересные статьи