В этой главе мы коснулись лишь основ работы с sed, но даже подученных знаний достаточно, чтобы с помощью sed решать многие задачи, возникающие в процессе обработки текста.
Дополнительные утилиты работы с текстом
Существует большое количество утилит, предназначенных для сортировки, объединения, разбиения и прочей обработки текстовых файлов. В этой главе мы познакомимся с такими командами:
• sort;
• uniq;
• join;
• cut;
• paste;
• split,
11.1. Сортировка файлов с помощью команды sort
Команда sort позволяет выполнять сортировку входного потока по различным полям (ключам сортировки). Это довольно мощная команда, которая весьма полезна при обработке журнальных файлов или реорганизации текстовых столбцов в файлах. В то же время следует быть внимательным при использовании ее многочисленных опций, так как зачастую можно получить неожиданные результаты. Не всегда понятна связь между указанной опцией и результатами, возвращаемыми командой sort. Некоторые опции перекрывают друг друга и, таким образом, допускают неоднозначную трактовку.
Мы не станем вдаваться в детали различных алгоритмов сортировки и рассматривать все возможные комбинации опций команды sort. Будут описаны лишь важнейшие из опций и представлены многочисленные примеры, позволяющие разобраться в особенностях функционирования этой команды.
Команда sort имеет следующий формат:
sort [опции] [входные_файлы]
Команда выполняет конкатенацию указанных входных файлов, сортирует полученный текст и записывает результат в стандартный выходной поток. Если файлы не указаны, ожидается ввод данных с клавиатуры.
Таблица 11.1. Основные опции команды sort
-с | Проверка того, отсортирован ли файл; сортировка не производится |
-m | Объединение отсортированных файлов; сортировка не производится |
-u | Удаление повторяющихся строк |
-о | Вывод результата не на экран, а в указанный файл |
-b | Игнорирование начальных пробелов в полях сортировки |
-n | Включение режима числовой сортировки |
-t | Задание разделителя полей |
-r | Сортировка в обратном порядке |
+поз1[-поз2] | Ключом сортировки становится строка, начинающаяся в позиции |
поз1 и заканчивающаяся перед позицией поз2 (или в конце текущей строки, если второй параметр не указан)*; номера полей и позиции начальных символов отсчитываются от нуля | |
-k поз1[, поз2] | Ключом сортировки становится строка, начинающаяся в позиции |
поз1 и заканчивающаяся в позиции поз2 (или в конце текущей строки, если второй параметр не указан)[2]; номера полей и позиции начальных символов отсчитываются от единицы | |
-n | Поле с номером я не должно сортироваться; значение n отсчитывается от нуля |
Чтобы сохранить результаты сортировки, укажите опцию -o и выходной файл. Можно также воспользоваться традиционным методом переадресации с помощью оператора >. В следующем примере результаты сортировки сохраняются в файле results.out
$ sort video.txt > results.out
Ниже приведен фрагмент файла 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:.