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

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

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

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

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

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

Файлы данных

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

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

Содержание

Ниже приводится содержимое файла file-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

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

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

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

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

  Как зашифровать разделы жесткого диска в Linux

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

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

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

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

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

Во-первых, поле, которое вы собираетесь сопоставить, должно быть отсортировано. У нас есть возрастающие числа в обоих файлах, поэтому мы соответствуем этому критерию. По умолчанию join использует первое поле в файле, что нам и нужно. Еще одно разумное значение по умолчанию — то, что join ожидает, что разделители полей будут пробелами. Опять же, у нас это есть, так что мы можем продолжить и запустить соединение.

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

join file-1.txt file-2.txt

В

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

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

  Как использовать FFMpeg с графическим интерфейсом в Linux с помощью QWinFF

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

Давайте попробуем что-нибудь, что, как мы знаем, не сработает. Мы разместим строки в одном файле не по порядку, поэтому join не сможет правильно обработать файл. Содержимое file-3.txt такое же, как и file-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

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

join file-1.txt file-3.txt

В

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

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

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

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

В

join заранее сообщает вам, что проблема будет в седьмой строке файла file-3.txt.

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

В file-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

В

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

Параметр -a (печать несопоставимых) указывает соединению также печатать строки, которые не могут быть сопоставлены.

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

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

В

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

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

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

В

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

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

Давайте сопоставим два новых файла в поле, которое не является значением по умолчанию (первое поле). Ниже приводится содержимое файла-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 (файл с двумя полями). За ними будет стоять число, указывающее, какое поле в каждом файле следует использовать для присоединения.

  Как установить док-станцию ​​Latte в KDE в Linux

Мы вводим следующее, чтобы сообщить join использовать первое поле в первом файле и второе — во втором:

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

В

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

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

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

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

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

Содержание

Мы можем использовать -t (символ-разделитель), чтобы указать соединению, какой символ использовать в качестве разделителя полей. В данном случае это запятая, поэтому мы набираем следующую команду:

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

В

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

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

Другой файл, 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

Когда мы соединили file-7.txt и file-8.txt, все заработало отлично. Посмотрим, что происходит с file-7.txt и file-9.txt.

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

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

В

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

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

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

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

В

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

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

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

Независимо от ситуации, вы будете рады, что присоединились к вам в своем углу!