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

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

Введение

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

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

Перевод и очистка потока символов

На этом шаге вы используете tr, чтобы преобразовать символы, объединить повторяющиеся разделители и удалить ненужные символы.

Создайте строку с намеренно непоследовательным оформлением. Команда cat -A показывает детали, которые обычно невидимы: пробелы остаются видимыми как промежутки, а $ обозначает конец строки. Так вы точно увидите, что нужно очистить:

cd /home/labex/project/text-combine-lab
printf '  API,,,Worker,,WEB  \n' > raw-services.txt
cat -A raw-services.txt

Команда tr SET1 SET2 заменяет символы из первого набора соответствующими символами из второго. Переносимые классы [:upper:] и [:lower:] обозначают прописные и строчные буквы:

tr '[:upper:]' '[:lower:]' < raw-services.txt

Теперь объедините три этапа в конвейер. Первый этап изменяет регистр букв; tr -s ',' сжимает каждую последовательность повторяющихся запятых до одной запятой; tr -d ' ' удаляет пробелы; а tee показывает и сохраняет итоговый поток:

tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt

Результатом должна быть строка api,worker,web. Команда tr читает поток, но не изменяет входной файл на месте.

Объединение соответствующих строк с помощью Paste

На этом шаге вы объедините файлы, в которых первая строка одного файла соответствует первой строке другого, вторая — второй и так далее.

Создайте один столбец с названиями сервисов и один столбец с их владельцами:

cd /home/labex/project/text-combine-lab
printf '%s\n' api worker web > services.txt
printf '%s\n' team-blue team-green team-blue > owners.txt

Команда paste размещает соответствующие строки рядом, по умолчанию разделяя их табуляцией:

paste services.txt owners.txt

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

paste -d, services.txt owners.txt | tee service-owners.csv

Команда paste не сравнивает ключи. Если в одном из файлов отсутствует строка или строки расположены в другом порядке, соответствия изменятся.

Объединение записей по общему ключу

На этом шаге вы объедините записи по совпадающему первому полю, а не по позиции строки.

Создайте две таблицы с разделителями-пробелами в разном порядке:

cd /home/labex/project/text-combine-lab
printf '%s\n' 'web 8080' 'api 9000' 'worker 9100' > ports-unsorted.txt
printf '%s\n' 'worker active' 'web active' 'api maintenance' > states-unsorted.txt

Команда join ожидает, что оба входных файла отсортированы по полю соединения. Подготовьте отсортированные копии. В sort -k1,1 параметр -k выбирает ключ, а 1,1 означает «начать и закончить полем 1», поэтому порядок определяется только названием сервиса:

sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt

Просмотрите отсортированные файлы, затем объедините совпадающие значения поля 1:

cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt

Каждая результирующая строка содержит общий ключ сервиса один раз, затем порт и состояние.

Создание понятного отчёта о сервисах

На этом шаге вы измените формат объединённых записей, не меняя исходные таблицы.

Замените пробелы запятыми, чтобы получить простой отчёт:

cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv

Добавьте заголовок, сгруппировав две команды. Фигурные скобки направляют вывод обеих команд в одно перенаправление:

{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv

Подсчитайте записи данных, не включая заголовок:

tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt

Этот рабочий процесс сохраняет небольшие этапы, которые легко проверять: нормализованные данные, объединённые данные, отформатированные данные и итоговый отчёт.

Итоги

Вы использовали tr для нормализации на уровне символов, paste — для объединения столбцов по позиции, а join — для работы с отсортированными связями по ключу. Затем вы объединили небольшие этапы в понятный CSV-отчёт, сохранив исходные входные файлы без изменений.