Выбрать главу

При работе с командой join следует быть внимательным, вычисляя номер нужного поля. Можно посчитать, что доступ реализуется к полю 4, а с точки зрения команды join это поле 5. В итоге будут получены неправильные результаты. Чтобы проверить, содержит ли поле с указанным номером предполагаемые данные, воспользуйтесь утилитой awk:

$ awk '{print $4}' имя_файла

11.4. Вырезание текста с помощью команды cut

Команда cut позволяет вырезать фрагменты строк из текстовых файлов или из стандартного входного потока. Извлеченный подобным образом текст направляется в стандартный выходной поток. Общий формат команды cut таков:

cut [опции] файлы…

Рассмотрим основные опции этой команды:

-c список Определяет, какие символы извлекаются из каждого входного файла

-f список Определяет, какие поля извлекаются из каждого входного файла

-d Задает разделитель полей

Параметр список в опциях -c и -f представляет собой разделенный запятыми список диапазонов символов или полей соответственно. Диапазон может быть задан в одной из четырех форм:

-n В выходной поток включается каждый n–й символ (поле) каждой строки

каждого входного файла

n- Диапазон формируется от n–го символа (поля) до конца строки

n–m Диапазон формируется от n–го символа (поля) до m–го символа (поля) включительно

-m Диапазон формируется от начала строки до m–го символа (поля)

11.4.1. Задание разделителя полей

В качестве входного файла мы возьмем файл pers из предыдущего примера, только на этот раз поля в нем будут разделены двоеточием.

$ cat pers

P. Jones:Office Runner:ID897

S. Round:UNIX admin:ID667

L. Clip:Personl Chief:ID982

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

$ cut -d: — f3 pers

ID897

ID667

ID982

Опция -d: говорит о том, что поля в файле разделяются двоеточием. Опция -f 3 задает выборку третьего поля.

Если требуется вырезать несколько полей, необходимо перечислить их в опции -f. Например, показанная ниже команда формирует список служащих с их идентификационными номерами:

$ cut -d: — f1,3 pers

P. Jones:ID897

S. Round:ID667

L. Clip:ID982

А вот как можно извлечь из каталога /etc/passwd регистрационные имена пользователей и имена их начальных каталогов, хранящиеся в полях 1 и 6 соответственно:

$ cut -d: — f1,6 /etc/passwd

gopher:/usr/lib/gopher‑data

ftp:/home/ftp

peter:/home/apps/peter

dave:/home/apps/dave

11.4.2. Вырезание отдельных символов

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

Рассмотрим такой пример. Когда в мою систему поступают файлы сообщений, я просматриваю их имена для определения источника, из которого они были получены. На основании этой информации производится сортировка файлов по каталогам.

Идентификатор источника содержится в последних трех символах имени файла. Вот примерный список имен файлов:

2231DG

2232DP

2236DK

Извлечение идентификаторов осуществляется с помощью такой команды:

$ 1s 223* | cut -с4–6

1DG

2DP

6DK

Показанная ниже команда возвращает список пользователей, зарегистрированных в данный момент в системе:

$ who! cut -c1-8

root

dave

peter

11.5. Вставка текста с помощью команды paste

С помощью команды cut отдельные символы и целые поля извлекаются из текстовых файлов или стандартного входного потока. Команда paste выполняет противоположное действие: она вставляет в выходной поток содержимое входных файлов. Прежде чем вставлять данные из разных источников, следует убедиться, что они содержат равное число строк, иначе будут сформированы неполные строки,

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

Формат команды paste таков:

paste [опции] файл…

Рассмотрим опции команды paste:

-d список Сообщает команде paste о необходимости применять вместо табуляции другой разделитель полей. Допускается указывать список разделителей, В этом случае разделители используются циклически: между первыми двумя строками вставляется первый разделитель из списка, между следующими двумя — второй и т. д. Когда список заканчивается, осуществляется возврат к началу списка и процедура повторяется.
-s Задает режим последовательного слияния строк каждого входного файла по отдельности
- Означает выборку строки из стандартного входного потока