Применив cut второй раз к нашему списку, мы смогли извлечь символы в позициях с 7-й по 10-ю, которые соответствуют году в поле с датой. Форма записи 7-10 — это пример определения диапазона. Полное описание особенностей определения диапазонов находится на странице справочного руководства (man) для команды cut.

При работе с полями определим разделитель, отличающийся от символа табуляции. Следующий пример извлекает первое поле из файла /etc/passwd:

[me@linuxbox ~]$ cut -d ':' -f 1 /etc/passwd | head

root

daemon

bin

sys

sync

games

man

lp

mail

news

С помощью параметра -d мы определили, что роль разделителя полей будет играть символ двоеточия.

замена символов табуляции

Наш файл distros.txt идеально отформатирован для извлечения полей с использованием cut. Но что, если нам понадобится обработать файл, вырезая фрагменты по символам, а не по полям? Для этого нам нужно заменить символы табуляции в файле соответствующим числом пробелов. К счастью, в GNU-пакете coreutils имеется инструмент для этого — программа expand. Она может принимать имена файлов в аргументах или данные со стандартного ввода и выводить измененный текст в стандартный вывод.

Если обработать наш файл distros.txt программой expand, мы сможем использовать cut -c для извлечения любых диапазонов символов из файла. Например, с помощью следующей команды можно извлечь год выпуска из нашего файла со списком, применив cut для извлечения всех символов с 23-й позиции до конца строки:

[me@linuxbox ~]$ expand distros.txt | cut -c 23-

В состав пакета coreutils входит также программа unexpand, замещающая пробелы символами табуляции.

paste — слияние строк из файлов

Команда paste выполняет операцию, обратную команде cut. Вместо извлечения колонок текста из файла она добавляет одну или несколько колонок текста в файл. Для этого она читает содержимое нескольких файлов, комбинирует поля, найденные в них, и выводит результат в стандартный вывод. Подобно программе cut, paste принимает несколько файлов в аргументах и/или данные со стандартного ввода. Для демонстрации возможностей программы paste выполним небольшую хирургическую операцию с файлом distros.txt, чтобы получить список выпусков в хронологическом порядке.

Сначала применим команду sort, чтобы получить список дистрибутивов, отсор­тированный по дате выпуска, и сохраним результат в файле distros-by-date.txt:

[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt > distros-bydate.txt

Затем с помощью cut извлечем два первых поля (с именами дистрибутивов и номерами версий) и сохраним результат в файле distro-versions.txt:

[me@linuxbox ~]$ cut -f 1,2 distros-by-date.txt > distros-versions.txt

[me@linuxbox ~]$ head distros-versions.txt

Fedora           10

Ubuntu           8.10

SUSE             11.0

Fedora           9

Ubuntu           8.04

Fedora           8

Ubuntu           7.10

SUSE             10.3

Fedora           7

Ubuntu           7.04

В заключение этапа подготовки извлечем даты выпусков и сохраним их в файле distro-dates.txt:

[me@linuxbox ~]$ cut -f 3 distros-by-date.txt > distros-dates.txt

[me@linuxbox ~]$ head distros-dates.txt

11/25/2008

10/30/2008

06/19/2008

05/13/2008

04/24/2008

11/08/2007

10/18/2007

10/04/2007

05/31/2007

04/19/2007

Теперь у нас есть все необходимое. Чтобы завершить процедуру, с помощью paste добавим колонку с датами перед названиями и номерами версий дистрибутивов, создав хронологический список. Для этого достаточно просто вызвать paste и передать ей файлы в требуемом порядке.

[me@linuxbox ~]$ paste distros-dates.txt distros-versions.txt

11/25/2008       Fedora          10

10/30/2008       Ubuntu          8.10

06/19/2008       SUSE            11.0

05/13/2008       Fedora          9

04/24/2008       Ubuntu          8.04

11/08/2007       Fedora          8

10/18/2007       Ubuntu          7.10

10/04/2007       SUSE            10.3

05/31/2007       Fedora          7

04/19/2007       Ubuntu          7.04

12/07/2006       SUSE            10.2

10/26/2006       Ubuntu          6.10

10/24/2006       Fedora          6

06/01/2006       Ubuntu          6.06

05/11/2006       SUSE            10.1

03/20/2006       Fedora          5

join — объединение строк из двух файлов по общему полю

Программа join действует подобно paste, в том смысле, что она добавляет колонки в файл, но делает это по-своему. Операция join у многих ассоциируется с реляционными базами данных, где она объединяет записи из нескольких таблиц по общему ключевому полю. Программа join выполняет ту же операцию. Она объединяет данные из множества файлов, опираясь на общее ключевое поле.

Перейти на страницу:

Похожие книги