Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
$ 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 считает, что файл не отсортирован. Давайте отсортируем его и посмотрим, что будет:
$ sort video.txt | sort -c $
Сообщение не появилось, таким образом, файл является отсортированным.
11.1.6. Простейшая сортировка
В простейшем случае, чтобы отсортировать файл, достаточно передать его имя команде sort. Сортировка будет выполнена по строкам:
$ sort video.txt
A Few Good Men:KL:445:5851
A. Iien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2]92
Star Wars:HK:301:4102
The tfili:KL:63:2972
Toy Story. HK:239:3972
11.1.7. Сортировка а обратном порядке
Если необходимо отсортировать строки не по возрастанию, а по убыванию, задайте опцию -r:
$ sort -r video.txt
Toy Story:HK:239:3972
The H111:KL:63:2972
Star Wars:HK:301:4102
Boys in Company С:HK:192:2192
Aliens:HK:532:4892
Alien:HK:119:1982
A Few Good Men:KL:445:5851
11.1.8. Сортировка по заданному полю
В следующем примере файл сортируется по кодам фирм–дистрибьюторов. Поскольку требуемая информация находится во втором поле (ключ сортировки 1(, следует указать опцию +1. Кроме того, необходимо задать разделитель полей с помощью опции -t:, чтобы команда sort знала, как найти второе поле.
$ sort -t: +1 video.txt
Alien:HK:119:1982
Boys in Company С:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301;4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
The Hill; KL:63:2972
Обратите внимание на то, что третье и четвертое поля также были отсортированы. Такова стандартная процедура: все последующие поля по умолчанию считаются ключами сортировки, расположенными в порядке убывания приоритета. Причем если вы посмотрите на конечные две строки, то заметите, что к этим полям применялась не числовая, а текстовая сортировка, учитывающая расположение символов в таблице ASCII–кодов. Поэтому поле со значением 445 оказалось расположенным раньше поля со значением 63.
11.1.9. Сортировка по числовому полю
Чтобы корректно отсортировать файл по четвертому, числовому, полю, укажите не только ключ сортировки (+3), но и опцию -n, включающую режим числовой сортировки. Следующая команда сортирует список фильмов по объемам проката видеокассет за год:
$ sort -t: +3n video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4B92
A Few Good Men:KL:445:5851
Таким образом, можно заключить, что фильм "A Few Good Men" ("Несколько хороших парней", 1992 г.) является лидером видеопроката в текущем году.
Примечание:
Несмотря на наличие опции -n, данный пример работает правильно только потому, что четвертое поле является последним в строке. Причина этого объясняется ниже.
11.1.10. Сортировка с отбрасыванием повторяющихся строк
Иногда приходится иметь дело с файлом, содержащим повторяющиеся строки. Чтобы избавиться от них, достаточно воспользоваться командой sort с опцией — и. Ниже показан вариант тестового файла, в котором запись о фильме "Alien" ("Чужой", 1977 г.) повторяется дважды:
$ cat video.txt
Boys in Company С:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
Aliens:HK:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL.445:5851