В процессе потоковой обработки файла мне иногда требуется добавить к каждой проверенной строке какой‑нибудь текст, сообщающий о том, как прошла обработка. Предположим, имеется такой файл:
$ cat ok.txt
АС456
АС492169
АС9967
АС88345
Наша задача состоит в добавлении слова "Passed" (обработано) в конец каждой строки. Решить ее несложно. Достаточно в шаблоне поиска указать метасимвол '$', означающий конец строки, а в шаблоне замены — пробел и искомое слово:
$ sed 's/$/ Passed/' ok.txt
АС456 Passed
АС492169 Passed
AC9967 Passed
AC8B345 Passed
10.16.4. Удаление начальной косой черты в путевом имени
Ниже показано, как с помощью редактора sed можно быстро удалить начальную косую черту из имени текущего каталога:
$ cd /usr/local
$ echo $PWD | sed 's/^\///g'
usr/local
Имя текущего каталога хранится в переменной среды Spwd. Эта переменная обновляется всякий раз, когда выполняется команда cd. Команда echo передает значение переменной по каналу редактору sed, который выполняет несложную обработку: находит в начале строки (метасимвол '^'( символ косой черты (защищен от интерпретации обратной косой чертой) и заменяет его пустой подстрокой.
10.17. Заключение
Редактор sed является эффективным инструментом фильтрации текста. Он дает возможность находить во входном потоке требуемые строки и последовательности символов и модифицировать их с наименьшими затратами времени и усилий. Как было показано, для извлечения из файлов требуемой информации вовсе не обязательно прибегать к написанию больших сценариев.
В этой главе мы коснулись лишь основ работы с sed, но даже подученных знаний достаточно, чтобы с помощью sed решать многие задачи, возникающие в процессе обработки текста.
ГЛАВА 11
Дополнительные утилиты работы с текстом
Существует большое количество утилит, предназначенных для сортировки, объединения, разбиения и прочей обработки текстовых файлов. В этой главе мы познакомимся с такими командами:
• sort;
• uniq;
• join;
• cut;
• paste;
• split,
11.1. Сортировка файлов с помощью команды sort
Команда sort позволяет выполнять сортировку входного потока по различным полям (ключам сортировки). Это довольно мощная команда, которая весьма полезна при обработке журнальных файлов или реорганизации текстовых столбцов в файлах. В то же время следует быть внимательным при использовании ее многочисленных опций, так как зачастую можно получить неожиданные результаты. Не всегда понятна связь между указанной опцией и результатами, возвращаемыми командой sort. Некоторые опции перекрывают друг друга и, таким образом, допускают неоднозначную трактовку.
Мы не станем вдаваться в детали различных алгоритмов сортировки и рассматривать все возможные комбинации опций команды sort. Будут описаны лишь важнейшие из опций и представлены многочисленные примеры, позволяющие разобраться в особенностях функционирования этой команды.
11.1.1. Опции команды sort
Команда sort имеет следующий формат:
sort [опции] [входные_файлы]
Команда выполняет конкатенацию указанных входных файлов, сортирует полученный текст и записывает результат в стандартный выходной поток. Если файлы не указаны, ожидается ввод данных с клавиатуры.
Таблица 11.1. Основные опции команды sort
-с
Проверка того, отсортирован ли файл; сортировка не производится
-m
Объединение отсортированных файлов; сортировка не производится
-u
Удаление повторяющихся строк
-о
Вывод результата не на экран, а в указанный файл
-b
Игнорирование начальных пробелов в полях сортировки
-n
Включение режима числовой сортировки
-t
Задание разделителя полей
-r
Сортировка в обратном порядке
+поз1[-поз2]
Ключом сортировки становится строка, начинающаяся в позиции
поз1 и заканчивающаяся перед позицией поз2 (или в конце текущей строки, если второй параметр не указан)*; номера полей и позиции начальных символов отсчитываются от нуля
-k поз1[, поз2]
Ключом сортировки становится строка, начинающаяся в позиции
поз1 и заканчивающаяся в позиции поз2 (или в конце текущей строки, если второй параметр не указан)
[2]
; номера полей и позиции начальных символов отсчитываются от единицы
-n
Поле с номером я не должно сортироваться; значение n отсчитывается от нуля
11.1.2. Сохранение результатов сортировки
Чтобы сохранить результаты сортировки, укажите опцию -o и выходной файл. Можно также воспользоваться традиционным методом переадресации с помощью оператора >. В следующем примере результаты сортировки сохраняются в файле results.out
$ sort video.txt > results.out
11.1.3. Тестовый файл
Ниже приведен фрагмент файла video.txt, хранящего информацию из базы данных фирмы, которая занимается прокатом видеокассет. В перечень вошли видеокассеты, которые предлагались на протяжении последнего квартала. Поля файла имеют следующее назначение:
1. Название фильма.
2. Код фирмы–дистрибьютора.
3. Количество заказов за последний квартал.
4. Количество заказов за последний год.
$ cat video.txt
Boys in Company C:HK:192:2192 Alies:HK:119:1982
The Hill:KL:63Yf972
Aliens:НК:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Toy Story:HK:239:3972
По умолчанию, команда sort предполагает, что разделителем полей служит один или несколько пробелов. Если же поля разделены иначе, следует применять опцию -t. В нашем файле разделителем является двоеточие. Поэтому в тех примерах, где это необходимо, задается опция -t:.
11.1.4. Индексация полей
При работе с командой sort не следует забывать, что команда обращается к первому полю как к полю 0, следующее поле имеет номер 1 и т. д. Если номера полей не указаны, вся строка считается единым полем. Обратимся к тестовому файлу и уточним, каким образом команда sort разбивает файл на поля:
Поле 0
Поле 1
Поле 2
Поле 3
Star Wars
HK
301
4102
A Few Good Men
KL
445
5851
11.1.5. Проверка факта сортировки файла
Каким образом можно узнать, отсортирован ли данный файл? Если он содержит, например, около 30 строк, то достаточно его просмотреть. А если в нем 400 строк? Примените команду sort -c, которая сама определит, отсортирован ли файл:
$ sort -с video.txt
sort: disorder on video.txt
Команда sort считает, что файл не отсортирован. Давайте отсортируем его и посмотрим, что будет: