Команды join и split решают разные задачи обработки файлов. join объединяет связанные записи двух отсортированных текстовых источников, а split делит один источник на последовательность меньших файлов.
Text-Fu · Урок 11
join и split
Научитесь объединять два отсортированных текстовых файла по ключу и разбивать один файл на именованные части.
Объединение двух файлов по первому полю
По умолчанию join сравнивает первые поля, разделённые пробельными символами, ровно в двух входных файлах. Рассмотрим уже отсортированные файлы.
people.txt:
1 John
2 Jane
3 Mary
surnames.txt:
1 Doe
2 Doe
3 Sue
Объединим записи с одинаковыми ключевыми полями:
$ join people.txt surnames.txt
1 John Doe
2 Jane Doe
3 Mary Sue
Вывод содержит общий ключ один раз, а затем остальные поля первого и второго файлов. join обрабатывает два файла за раз и не принимает три обычных файловых операнда как трёхстороннее реляционное объединение.
Какие записи объединяет join first.txt second.txt без параметров полей?
Сортировка ключей объединения
Каждый входной файл должен быть упорядочен по своему полю объединения с совместимыми правилами сравнения. Для стандартного поля 1 подготовьте копии командой sort -k 1,1:
$ LC_ALL=C sort -k 1,1 people-raw.txt > people.txt
$ LC_ALL=C sort -k 1,1 surnames-raw.txt > surnames.txt
$ LC_ALL=C join people.txt surnames.txt
Одинаковая локаль сортировки и объединения обеспечивает согласованные правила сопоставления. Не перенаправляйте результат sort обратно в тот же входной путь: оболочка сначала усечёт файл.
Какая подготовка обычно нужна join для надёжного сопоставления?
Выбор других полей объединения
Используйте -1 FIELD для ключа первого файла и -2 FIELD для ключа второго. Предположим, первый источник содержит:
John 1
Jane 2
Mary 3
А второй:
1 Doe
2 Doe
3 Sue
После сортировки первого файла по полю 2, а второго по полю 1 выполните:
$ join -1 2 -2 1 people.txt surnames.txt
1 John Doe
2 Jane Doe
3 Mary Sue
Используйте -t CHARACTER, если поля разделяет один непробельный символ, например :. Параметры -a 1 и -a 2 позволяют включить несопоставленные строки соответствующего источника; по умолчанию выводятся только совпавшие ключи.
Какие параметры объединяют поле 2 первого файла с полем 1 второго?
Разбиение по количеству строк
split записывает последовательные части одного источника в отдельные выходные файлы. Эта команда не является обратной для основанного на ключах join.
$ split large.txt
По умолчанию GNU-реализация записывает до 1000 строк в каждый выходной файл и использует префикс x, создавая имена вроде xaa, xab и xac.
Задайте число строк параметром -l NUMBER, а последним операндом — префикс выходных файлов:
$ split -l 500 large.txt part-
Будут созданы part-aa, part-ab и последующие части, каждая не более чем по 500 строк.
Какая команда разбивает large.txt на части не более 500 строк с префиксом part-?
Разбиение по размеру
Используйте -b SIZE, чтобы делить ввод по числу байтов. Суффиксы GNU вроде K, M и G в этом контексте обозначают степени 1024:
$ split -b 10M archive.bin chunk-
Команда запрашивает части по 10 мебибайтов, кроме, возможно, меньшей последней. split не создаёт манифест архива или метаданные сборки; при необходимости восстановления сохраняйте порядок суффиксов и объединяйте части в нём.
Какая команда разбивает archive.bin на части по 10 МиБ с префиксом chunk-?
Чтобы попрактиковаться в объединении по ключам и обработке структурированных данных, выполните лабораторные работы:
- Команда join в Linux: объединение файлов — попрактикуйтесь объединять строки двух отсортированных текстовых файлов по общему полю.
- Обработка данных сотрудников — примените
joinи другие утилиты командной строки, включаяawk, для объединения и обработки данных из нескольких источников.
Урок завершён
Вы завершили join и split
Теперь вы можете объединять отсортированные записи или делить один источник на упорядоченные части.
Объединяйте ровно два файла по равным ключевым полям.
Согласованно сортируйте оба источника по ключам объединения.
Выбирайте нестандартные ключевые поля параметрами
-1и-2.Разбивайте по числу строк с помощью
-l.Разбивайте по числу байтов с помощью
-bи понятного префикса.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт