Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 6:

Средства обработки структурированных данных

Еще один оператор реляционной СУБД - join - выдает на стандартный вывод результат соединения двух отношений, задаваемых строками файла1 и файла2:

join [-a номер_файла | -v номер_файла] 
   [-e цепочка] [-o список] [-t символ]
   [-1 номер_поля] [-2 номер_поля] файл1 файл2

Отношения файл1 и файл2 должны быть отсортированы в возрастающем лексикографическом порядке по полям соединения (обычно по первому полю в каждой строке).

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

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

Допустимы следующие опции.

-a номер_файла

В дополнение к обычному выводу выдать строку для каждой непарной строки из файла с указанным номером (1 или 2).

-e цепочка

Заменить пустые поля вывода из списка опции -o заданной цепочкой символов.

-o список

Составлять выходные строки из полей, заданных в списке. Элемент списка имеет вид номер_файла.номер_поля или

-t символ

Использовать символ в качестве разделителя. Каждое вхождение символа в строку значимо. Указанный символ используется как разделитель и при вводе, и при выводе.

-v номер_файла

Вместо подразумеваемого вывода выдавать только непарные строки из файла с указанным номером (1 или 2).

-1 номер_поля

Производить соединение по полю   файла1 с заданным номером.

-2 номер_поля

Производить соединение по полю   файла2 с заданным номером.

Рассмотрим примеры. Командная строка (см. листинг 6.45) выполняет соединение баз данных пользователей и групп, отсортированных в порядке возрастания идентификаторов групп. На стандартный вывод поступают входные имена, имена групп и основные каталоги (см. листинг 6.46).

join -1 4 -2 3 -o 1.1,2.1,1.6 -t : 
     passwd.sorted group.sorted
Листинг 6.45. Пример использования служебной программы join.
halt:root:/sbin
operator:root:/root
root:root:/root
shutdown:root:/sbin
sync:root:/sbin
bin:bin:/bin
daemon:daemon:/sbin
. . .
Листинг 6.46. Начальный фрагмент возможного результата работы служебной программы join.

Пусть имеется два упорядоченных по алфавиту справочника: номера телефонов и адреса электронной почты (см. листинг 6.47). Предполагается, что в качестве разделителя полей применяется символ табуляции. Тогда командная строка, показанная в листинге 6.48, позволит получить объединенный справочник (см. листинг 6.49).

Имя Номер телефона
Иван 123-4567
Петр 123-5678
Яков 123-6789

Имя Адрес электронной почты
Иван ivan123@mail.ru
Олег oleg@yahoo.com
Яков yak@yandex.ru
Листинг 6.47. Возможное содержимое двух справочников с информацией о телефонных номерах и об адресах электронной почты.
join -t '<tab>' -a 1 -a 2 -e '---------' 
     -o 0,1.2,2.2 phone.txt email.txt
Листинг 6.48. Еще один пример использования служебной программы join.
Имя Номер телефона Адрес электронной почты
Иван 123-45-67 ivan123@mail.ru
Олег --------- oleg@yahoo.com
Петр 123-56-78 ---------
Яков 123-67-89 yak@yandex.ru
Листинг 6.49. Возможный результат работы служебной программы join.

Читателю предлагается самостоятельно выбрать правильный способ задания символа табуляции в качестве аргумента опции -t служебной программы join, а также объяснить, зачем нужен пробел в начале заголовка каждого из справочников.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?