Введение
В этом практическом занятии (лабораторной работе) вы познакомитесь с командой join в Linux, мощным инструментом, который позволяет объединять данные из двух файлов на основе общего поля. Аналогично объединению таблиц в базе данных, эта команда особенно полезна для задач обработки и анализа данных в среде Linux.
В рамках этого практического занятия вы научитесь использовать команду join с различными параметрами для объединения данных из отдельных файлов, работать с разными разделителями полей и понять основные принципы операций объединения файлов в Linux. Эти навыки окажутся ценными при работе со структурированными данными в текстовых файлах, что является обычной задачей в системном администрировании и анализе данных.
Понимание базовой команды 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)
Эта команда выполняет следующие операции:
tr ',' '-' < ~/project/winds_comma.txt- Заменяет все запятые на дефисы в содержимом файлаwinds_comma.txt<(...)- Подстановка процесса (process substitution), которая позволяет рассматривать вывод вложенной команды как файл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, предоставляя вам мощный инструментарий для манипуляции данными в командной строке.



