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
Задает режим последовательного слияния строк каждого входного файла по отдельности
-
Означает выборку строки из стандартного входного потока
11.5.1. Определение порядка вставки столбцов
Для иллюстрации процедуры вставки обратимся к следующим двум файлам, полученным путем применения команды cut к рассмотренному выше файлу pers.
$ cat pas1
ID897
ID667
ID9B2
$ cat раs2
P. Jones
S. Round
L. Clip
По умолчанию команда paste вставляет столбцы один за другим:
$ paste pas1 pas2
ID897 P. Jones
ID667 S. Round
ID982 L. Clip
Порядок задания файлов в командной строке играет роль:
$ paste pas2 pas1
P. Jones ID897
S. Round ID667
L. Clip ID982
11.5.2. Выбор разделителя полей
Если требуется создать выходной файл, в котором разделителем полей будет какой‑то другой символ вместо табуляции, воспользуйтесь опцией -d. В приведенном ниже примере строки объединяемых файлов разделяются двоеточием:
$ paste -d: pas2 pas1
P. Jones:ID897
S. Round:ID667
L. Clip:ID982
11.5.3. Слияние строк
Наличие опции -s заставляет команду paste работать немного по–другому: для каждого входного файла она выполняет слияние всех его строк, записывая результат в выходной поток. Представленная ниже команда сначала отображает все имена служащих, а затем — их идентификационные номера.
$ paste -a pas2 pas1
P. Jones S. Round L. Clip
ID897 ID667 ID982
11.5.4. Чтение данных и» стандартного входного потока
Команда paste имеет удобную опцию — (дефис), которая позволяет принимать данные из стандартного входного потока. Каждый дефис в командной строке соответствует одной колонке выходных данных. Например, список файлов каталога можно отобразить в четырехколоночном формате, как показано ниже:
$ cd /etc
$ ls | paste -d" " - - - -
init.d rc rc.local rc.sysinit rc0.d rc1.d rc2.d rc3.d rc4.d rc5–d rc6.d
Если же нужно отобразить список в одну колонку, воспользуйтесь такой командой:
$ ls | paste -
init. d
rc
rc.local
rc.sysinit
rc0.d
rc1.d
11.6. Разделение файла на части с помощью команды split
Команда split позволяет разделять крупные текстовые файлы на более мелкие, Это может оказаться удобным, например, при передаче файлов по сети. Общий формат команды split таков:
split [-размер_выходного_файла] входной_файл [префикс]
Первый параметр определяет количество строк, на которое нужно разбить файл. По умолчанию файл разбивается на фрагменты по 1000 строк. Если размер файла не кратен 1000, последний фрагмент будет содержать менее 1000 строк. Например, из файла, содержащего 2800 строк, в результате выполнения данной команды образуются три файла, включающих соответственно 1000, 1000 и 800 строк.
Имя каждого созданного файла представляется в формате от префикс[аа] до префикс[zz]. По умолчанию префиксом является буква 'x'. Таким образом, команда split создает такую последовательность файлов:
хаа, xab, … xzy, xzz
Если расположить файлы в алфавитном порядке и выполнить их последовательную конкатенацию, получим исходный файл.
Следующий пример поможет разъяснить сказанное. Допустим, имеется файл bigone.txt, содержащий 2800 строк. В результате выполнения команды split будут сформированы три выходных файла:
Имя файла Размер
xaa 1000
xab 1000
xac 800
Теперь рассмотрим, как изменить размер создаваемых файлов. Ниже показан файл split1, содержащий шесть строк:
$ cat split1
this ls line1
this ls line2
this ls line3
this ls line4
this ls line5
this ls line6
Для разделения его на фрагменты по две строки в каждом воспользуемся такой командой:
$ split -2 split1
Давайте проверим, что было создано (команда ls -lt сортирует список файлов по дате создания, а команда head отбирает из этого списка первые десять элементов):
$ ls -lt | head
total 205
-rw‑r--r-- 1 dave admin 28 Apr 30 13:12 xaa
-rw‑r--r-- 1 dave admin 28 Apr 30 13:12 xab
-rw‑r--r-- 1 dave admin 28 Apr 30 13:12 xac
Исходный файл состоит из шести строк. В результате применения к нему команды split были сформированы три файла, содержащих по две строки каждый. Чтобы убедиться в правильности работы команды, рассмотрим содержимое файла хаc, который должен включать последние две строки:
$ cat xac
this ls line5
this ls line6
11.7. Заключение
В настоящей главе были рассмотрены различные стандартные утилиты (sort, unique, join, cut, paste и split, а также head и tail), имеющие отношение, главным образом, к сортировке, разделению и объединению текстовых файлов. Применение каждой из них иллюстрировалось многочисленными примерами, которые позволят вам сформировать четкое представление о возможностях этих утилит. Я надеюсь, что благодаря изложенным сведениям вы смогли пополнить свой багаж знаний об инструментах работы с текстом, имеющихся в UNIX и Linux.
ГЛАВА 12 Утилита tr