Объединение файлов в Linux

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

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

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/tr("Character Translating") linux/TextProcessingGroup -.-> linux/join("File Joining") subgraph Lab Skills linux/cat -.-> lab-271313{{"Объединение файлов в Linux"}} linux/tr -.-> lab-271313{{"Объединение файлов в Linux"}} linux/join -.-> lab-271313{{"Объединение файлов в Linux"}} end

Понимание базовой команды join

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

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

Сначала создайте файл с именем storms.txt с идентификаторами штормов и датами:

echo -e "1:2023-04-01\n2:2023-04-15\n3:2023-05-02" > ~/project/storms.txt

Теперь создайте другой файл с именем winds.txt с идентификаторами штормов и направлениями ветра:

echo -e "1:NW\n2:SE\n3:NE" > ~/project/winds.txt

Проверим содержимое этих файлов, чтобы понять их структуру:

cat ~/project/storms.txt

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

1:2023-04-01
2:2023-04-15
3:2023-05-02

Теперь посмотрим на файл с данными о ветре:

cat ~/project/winds.txt

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

1:NW
2:SE
3:NE

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

join -t: ~/project/storms.txt ~/project/winds.txt

Опция -t: сообщает команде join, что разделителем полей в обоих файлах является двоеточие (:). По умолчанию команда join ищет общее поле в первой колонке каждого файла.

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

1:2023-04-01:NW
2:2023-04-15:SE
3:2023-05-02:NE

Этот вывод показывает объединенные данные из обоих файлов. Каждая строка содержит:

  • Идентификатор шторма (общее поле)
  • Дату (из первого файла)
  • Направление ветра (из второго файла)

Команда join сопоставила строки с одинаковыми идентификаторами шторма и объединила их в отдельные строки в выводе.

Объединение файлов с разными разделителями полей

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

Создадим два файла с разными разделителями полей:

Сначала создайте файл с именем storms_dash.txt с идентификаторами штормов и датами, используя дефис (-) в качестве разделителя:

echo -e "1-2023-04-10\n2-2023-04-20\n3-2023-05-05" > ~/project/storms_dash.txt

Затем создайте другой файл с именем winds_comma.txt с идентификаторами штормов и направлениями ветра, используя запятую (,) в качестве разделителя:

echo -e "1,NW\n2,SE\n3,NE" > ~/project/winds_comma.txt

Проверим содержимое этих файлов:

cat ~/project/storms_dash.txt

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

1-2023-04-10
2-2023-04-20
3-2023-05-05

Теперь посмотрим на файл winds_comma.txt:

cat ~/project/winds_comma.txt

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

1,NW
2,SE
3,NE

Здесь возникает проблема: команда join предполагает, что оба файла используют один и тот же разделитель полей. Чтобы решить эту проблему, нам нужно предварительно обработать один из файлов, чтобы разделитель в нем соответствовал разделителю в другом файле. Мы можем использовать команду tr для замены символов:

join -t- ~/project/storms_dash.txt <(tr ',' '-' < ~/project/winds_comma.txt)

Эта команда выполняет следующие операции:

  1. tr ',' '-' < ~/project/winds_comma.txt - Заменяет все запятые на дефисы в содержимом файла winds_comma.txt
  2. <(...) - Подстановка процесса (process substitution), которая позволяет рассматривать вывод вложенной команды как файл
  3. join -t- ~/project/storms_dash.txt - Объединяет файл storms_dash.txt с преобразованными данными, используя дефис (-) в качестве разделителя полей

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

1-2023-04-10-NW
2-2023-04-20-SE
3-2023-05-05-NE

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

Продвинутые опции команды join

В реальных задачах обработки данных вам часто приходится использовать более продвинутые операции объединения, такие как обработка несопоставленных данных или выбор определенных полей. На этом этапе вы познакомитесь с этими продвинутыми опциями команды join.

Создадим два более сложных файла для наших примеров:

echo -e "1:2023-04-01:Thunderstorm\n2:2023-04-15:Hurricane\n3:2023-05-02:Tornado\n4:2023-05-10:Blizzard" > ~/project/storms_types.txt
echo -e "1:High\n2:Medium\n5:Low" > ~/project/severity.txt

Проверим содержимое этих файлов:

cat ~/project/storms_types.txt

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

1:2023-04-01:Thunderstorm
2:2023-04-15:Hurricane
3:2023-05-02:Tornado
4:2023-05-10:Blizzard
cat ~/project/severity.txt

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

1:High
2:Medium
5:Low

Обратите внимание, что в этих файлах идентификаторы не совпадают полностью:

  • В файле severity.txt есть запись для идентификатора шторма 5, который отсутствует в файле storms_types.txt
  • В файле storms_types.txt есть записи для идентификаторов штормов 3 и 4, которые отсутствуют в файле severity.txt

По умолчанию команда join выводит только те строки, в которых поле объединения совпадает в обоих файлах:

join -t: ~/project/storms_types.txt ~/project/severity.txt

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

1:2023-04-01:Thunderstorm:High
2:2023-04-15:Hurricane:Medium

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

Обработка несопоставленных строк

Чтобы включить несопоставленные строки в вывод, вы можете использовать опцию -a:

join -t: -a 1 -a 2 ~/project/storms_types.txt ~/project/severity.txt

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

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

1:2023-04-01:Thunderstorm:High
2:2023-04-15:Hurricane:Medium
3:2023-05-02:Tornado:
4:2023-05-10:Blizzard:
5::Low

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

Выбор определенных полей

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

join -t: -o 1.1,1.3,2.2 ~/project/storms_types.txt ~/project/severity.txt

Опция -o 1.1,1.3,2.2 указывает, какие поля нужно вывести:

  • 1.1: Первое поле из первого файла (идентификатор шторма)
  • 1.3: Третье поле из первого файла (тип шторма)
  • 2.2: Второе поле из второго файла (уровень тяжести)

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

1:Thunderstorm:High
2:Hurricane:Medium

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

Итоги

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

Вы практиковались в использовании команды join с различными опциями:

  • Базовый синтаксис для объединения файлов с одинаковым разделителем полей
  • Обработка файлов с разными разделителями полей с использованием подстановки процесса и команды tr
  • Использование опции -a для включения несопоставленных строк в вывод
  • Использование опции -o для выбора определенных полей из каждого файла для вывода

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