Как использовать команду join в Linux
Фатмавати Ахмад Дзэнури / Shutterstock
Если вы хотите объединить данные из двух текстовых файлов, сопоставив общее поле, вы можете использовать Linux join
команда. Это добавляет динамизма вашим статическим файлам данных. Мы покажем вам, как им пользоваться.
Сопоставление данных в файлах
Данные - это король. На нем в равной степени работают корпорации, предприятия и домашние хозяйства. Но данные, хранящиеся в разных файлах и сопоставленные разными людьми, - это проблема. Помимо того, что вы знаете, какие файлы открывать для поиска нужной информации, их макет и формат могут отличаться.
Вам также придется столкнуться с административной головной болью, связанной с тем, какие файлы необходимо обновить, какие необходимо создать резервную копию, какие файлы являются устаревшими и какие можно заархивировать.
Кроме того, если вам нужно консолидировать данные или провести анализ всего набора данных, у вас возникнет дополнительная проблема. Как вы рационализируете данные в разных файлах, прежде чем сможете делать с ними то, что вам нужно? Как вы подходите к этапу подготовки данных?
Хорошей новостью является то, что файлы имеют хотя бы один общий элемент данных, Linux join
Команда может вытащить вас из трясины.
Файлы данных
Все данные мы будем использовать для демонстрации использования join
Команда является вымышленной, начиная со следующих двух файлов:
file-1.txt
file-2.txt
Ниже приводится содержимое file-2.txt
:
join
Реклама У нас есть набор пронумерованных строк, и каждая строка содержит всю следующую информацию:
- & rsaquo; Киберпонедельник 2021: лучшие технические предложения
- & rsaquo; Киберпонедельник 2021: лучшие предложения Apple
- & rsaquo; Функции и формулы в Microsoft Excel: в чем разница?
- & rsaquo; 5 сайтов, которые каждый пользователь Linux должен добавить в закладки
- & rsaquo; Как найти упакованный Spotify 2021
- & rsaquo; Папке на компьютере 40 лет: как звезда Xerox создала рабочий стол
Ниже приводится содержимое 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 для разработчиков и энтузиастов
ПРОЧИТАЙТЕ СЛЕДУЮЩИЙДэйв Маккей впервые использовал компьютеры, когда в моде была перфолента, и с тех пор он занимается программированием. Проработав более 30 лет в ИТ-индустрии, он теперь работает журналистом в области информационных технологий. За свою карьеру он работал программистом-фрилансером, менеджером международной группы разработчиков программного обеспечения, менеджером проекта ИТ-услуг, а в последнее время - специалистом по защите данных. Его статьи были опубликованы на сайтах howtogeek.com, cloudsavvyit.com, itenterpriser.com и opensource.com. Дэйв - евангелист Linux и сторонник открытого исходного кода.
Прочитать полную биографию