В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Средства обработки структурированных данных
Еще один оператор реляционной СУБД - 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, а также объяснить, зачем нужен пробел в начале заголовка каждого из справочников.