Опубликован: 15.06.2004 | Уровень: специалист | Доступ: платный
Лекция 6:

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

Аналоги реляционных операций для текстовых файлов

Служебная программа cut

cut -b список [-n] [файл ...]
cut -c список [файл ...]
cut -f список [-d разделитель] 
    [-s] [файл ...]

используется для выборки байт (опция -b ), символов ( -c ) либо ограниченных разделителями полей (опция -f ) с заданными списком номерами из строк исходных файлов, их конкатенации и выдачи на стандартный вывод. Если применить терминологию реляционных баз данных, cut выполняет операцию проекции отношения.

Список, являющийся аргументом опций -b, -c и -f, задается как последовательность разделенных запятыми или пробелами положительных чисел или диапазонов (с естественными умолчаниями, когда границы опущены). Опция -d определяет разделитель полей (по умолчанию это символ табуляции), -n предписывает не разрывать (многобайтные) символы, опция -s в сочетании с -f подавляет вывод строк, в которых не оказалось символов-разделителей (по умолчанию такие строки копируются на стандартный вывод без изменений).

Пример. Чтобы выделить из базы данных пользователей входные имена и идентификаторы, можно воспользоваться командой, показанной в листинге 6.40. Начальный фрагмент возможного результата приведен в листинге 6.41.

cut -d : -f 1,3 /etc/passwd
Листинг 6.40. Пример использования служебной программы cut.
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
. . .
Листинг 6.41. Начальный фрагмент возможного результата работы служебной программы cut.

Служебная программа paste

paste [-s] [-d список] файл ...

в терминологии реляционных баз данных осуществляет горизонтальное соединение, конкатенируя соответственные строки исходных файлов и помещая результат на стандартный вывод. При наличии опции -s конкатенируются строки каждого из исходных файлов. Во всех случаях строки склеиваются посредством символа табуляции (по умолчанию) или символов из списка - аргумента опции -d. Список этих символов рассматривается как кольцевой, т. е. будучи исчерпан, он используется повторно. Сочетание \0 в нем трактуется как пустая цепочка, а не как нулевой символ.

В качестве имени исходного файла может быть задан минус, что означает стандартный ввод. Если минус употреблен многократно, то стандартный ввод читается построчно, циклически по именам - минусам. Любопытно отметить, что стандарт POSIX-2001 предписывает реализациям поддерживать обработку не менее двенадцати исходных файлов.

Рассмотрим несколько примеров. Для выдачи в четыре столбца имен файлов текущего каталога можно воспользоваться конвейером, показанным в листинге 6.42.

ls | paste - - - -
Листинг 6.42. Пример использования служебной программы paste.

Для попарного слияния последовательных строк файла целесообразно "сыграть" на том, что список разделителей - кольцевой (см. листинг 6.43).

paste -s -d "\0\n" f.txt
Листинг 6.43. Пример использования служебной программы paste с кольцевым списком разделителей.

Если файл не подпадает под определение текстового из-за чрезмерно длинных строк, утилитой cut можно выделить начальные байты, поместив "хвосты" строк в другой файл. В дальнейшем из двух полученных файлов с помощью служебной программы paste можно воссоздать исходный (см. листинг 6.44).

cut -b 1-80 -n f > f1.txt
cut -b 81- -n f > f2
. . .
paste -d '\0' f1.txt f2 > f3
Листинг 6.44. Пример использования служебных программ cut и paste.
Антон Коновалов
Антон Коновалов

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