Команда Linux join: объединение файлов

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь использовать команду join в Linux для объединения данных из нескольких файлов. Мы смоделируем ситуацию, когда вы работаете в отделе кадров компании и вам нужно объединить информацию о сотрудниках из разных баз данных. Эта практическая задача продемонстрирует мощность и гибкость команды join для задач обработки данных.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/join("File Joining") subgraph Lab Skills linux/cd -.-> lab-219193{{"Команда Linux join: объединение файлов"}} linux/join -.-> lab-219193{{"Команда Linux join: объединение файлов"}} end

Понимание содержимого файлов данных

Начнем с изучения содержимого наших файлов с данными о сотрудниках. У нас есть два файла: employees.txt и salaries.txt.

Сначала перейдите в директорию проекта:

cd /home/labex/project

Эта команда изменяет текущую рабочую директорию на /home/labex/project. Все последующие операции будут выполняться в этой директории.

Теперь давайте посмотрим на содержимое файла employees.txt:

cat employees.txt

Команда cat отображает содержимое файла. Вы должны увидеть вывод, похожий на следующий:

1001 John Engineering
1002 Sarah Marketing
1003 Mike Sales
1004 Emily HR
1005 David Finance

Каждая строка представляет сотрудника с его идентификатором, именем и отделом.

Далее, давайте посмотрим на файл salaries.txt:

cat salaries.txt

Вывод должен быть похожим на:

1001 75000
1002 65000
1003 70000
1004 60000
1005 80000

В этом файле содержатся идентификаторы сотрудников и соответствующие им зарплаты.

Эти файлы представляют отдельные базы данных, которые мы объединим с помощью команды join.

Базовая операция объединения (join)

Теперь, когда мы понимаем наши данные, давайте используем команду join для объединения информации из обоих файлов на основе идентификатора сотрудника.

Запустите следующую команду:

join employees.txt salaries.txt

Вы должны увидеть вывод, похожий на следующий:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000

Разберем, что произошло:

  1. Команда join проверила первое поле (идентификатор сотрудника) в обоих файлах.
  2. Когда она нашла совпадающие идентификаторы, она объединила строки из обоих файлов.
  3. Вывод показывает идентификатор сотрудника, за которым следуют все поля из файла employees.txt, а затем все поля из файла salaries.txt (за исключением идентификатора, который был бы избыточным).

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

Настройка вывода объединения (join)

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

Попробуйте следующую команду:

join -o 1.2,1.3,2.2,1.1 employees.txt salaries.txt

Вы должны увидеть:

John Engineering 75000 1001
Sarah Marketing 65000 1002
Mike Sales 70000 1003
Emily HR 60000 1004
David Finance 80000 1005

Разберем опцию -o:

  • -o означает "формат вывода" (output format)
  • 1.2 означает второе поле из первого файла (имя)
  • 1.3 означает третье поле из первого файла (отдел)
  • 2.2 означает второе поле из второго файла (зарплата)
  • 1.1 означает первое поле из первого файла (идентификатор сотрудника)

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

Обработка несоответствующих записей

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

Добавьте этого сотрудника в файл employees.txt:

echo "1006 Alex IT" >> employees.txt

Оператор >> добавляет новую строку в конец файла без перезаписи существующего содержимого.

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

join employees.txt salaries.txt

Вы заметите, что Алекс не появляется в выводе, потому что в файле salaries.txt нет соответствующей записи.

Для включения несоответствующих записей можно использовать опцию -a:

join -a 1 employees.txt salaries.txt

Теперь вы должны увидеть Алекса в выводе:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000
1006 Alex IT

Опция -a 1 сообщает команде join включить несоответствующие строки из первого файла (employees.txt). Это полезно, когда вы хотите увидеть все записи из одного файла, даже если для них нет соответствий в другом файле.

Объединение по другому полю

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

Давайте создадим новый файл с именем departments.txt с кодами отделов:

cat << EOF > departments.txt
Engineering ENG
Marketing MKT
Sales SLS
HR HRS
Finance FIN
IT ITS
EOF

Эта команда создает новый файл departments.txt с названиями отделов и соответствующими им кодами.

Теперь давайте объединим этот файл с нашим файлом employees.txt на основе названия отдела:

join -1 3 -2 1 employees.txt departments.txt

Вы должны увидеть:

Engineering 1001 John ENG
Marketing 1002 Sarah MKT
Sales 1003 Mike SLS
HR 1004 Emily HRS
Finance 1005 David FIN
IT 1006 Alex ITS

Разберем команду:

  • -1 3 сообщает команде join использовать третье поле из первого файла (employees.txt) в качестве поля для объединения
  • -2 1 сообщает ей использовать первое поле из второго файла (departments.txt) в качестве поля для объединения

Это позволяет нам объединять файлы на основе любого общего поля, а не только первого. Это особенно полезно, когда ваши файлы имеют разную структуру, но имеют общую информацию.

Резюме

В этом практическом занятии вы узнали, как использовать команду join в Linux для объединения данных из нескольких файлов. Мы рассмотрели несколько ключевых возможностей команды join:

  • Базовое объединение двух файлов на основе общего поля
  • Настройка порядка вывода с использованием опции -o
  • Включение несоответствующих записей с помощью опции -a
  • Объединение по полям, отличным от первого столбца, с использованием опций -1 и -2

Дополнительные опции команды join, не рассмотренные в этом практическом занятии, включают:

  • -t CHAR: Использовать символ CHAR в качестве разделителя полей при вводе и выводе
  • -i: Игнорировать различия в регистре при сравнении полей
  • -e STRING: Заменить отсутствующие входные поля на строку STRING
  • -j FIELD: Эквивалентно '-1 FIELD -2 FIELD'
  • -v FILE_NUMBER: Как -a FILE_NUMBER, но подавлять объединенные строки вывода

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

Ресурсы