Шрифт:
The Hill:KL:63:2972
Здесь ссылка на первое поле в действительности означает ссылку на всю строку, т. е. ключ с меньшим приоритетом включает в себя ключ с большим приоритетом, поэтому команда sort ведет себя не так, как можно было бы предположить на первый взгляд. Чтобы исправить ситуацию, необходимо четко указать длину каждого из ключей:
$ sort -t: — k2,2 -k1,1 video.txt
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:132:2192
Star Wars:HK:301;4102
Toy Story:HK:239:3972
A Few Good Men:KL:445:5851
The Hill:KL:63:2972
Опция -k2,2 ограничивает ключ сортировки вторым полем, а опция -kl,1 — первым.
11.1.13. Указание позиции, с которой начинается сортировка
Иногда в качестве ключа сортировки требуется задать не целое поле, а какую-то его часть. В этом случае после номера поля необходимо через точку указать позицию символа, являющегося первым в ключе.
Обратимся к примеру. Допустим, в нашем тестовом файле к каждому коду фирмы–дистрибьютора добавлен код региона дистрибуции:
$ cat video.txt
Boys in Company C:HK48:192:2192 Alien:HK57:H9:1982
The Hill:KL23:63:2972
Aliens:НК11: — 5Э2г4892
Star Wars:HK38:301:4102
A Few Good Men:KL87:445:5851
Toy Story:HK65:239:3972
Теперь мы хотим отсортировать файл по кодам регионов. Вот как можно это сделать:
$ sort -t: — k2.3,2,4n video.txt
Aliens:HK13:532:4892
The Hill:KL23:63:2972
Star Wars:HK38:301:4102
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Toy Story:HK65:239:3972
A Few Good Men:KL87:445:5851
Данная команда означает, что ключом сортировки являются третий и четвертый символы второго поля.
11.1.14. Обработка результатов сортировки с помощью команд head и tail
При работе с большими файлами не обязательно выводить на экран весь файл, если требуется просмотреть только его начало и конец. Существуют удобные команды head и tail, упрощающие подобную задачу. Команда head отбирает первые п строк файла (по умолчанию 10), а команда tail — последние я строк (по умолчанию тоже 10).
Предположим, требуется быстро узнать, какой фильм пользуется наименьшим спросом в прокате. Для этого отсортируем файл по четвертому полю и направим результат команде head, задав в ней отображение одной строки:
$ sort -t: — k4 video.txt | head -1
Alien:HK:119:1982
Аналогичным образом можно выяснить, какой фильм чаще всего заказывали в этом году. Формат команды sort останется таким же, но результат будет передан команде tail:
$ sort -t: — k4 video.txt | tail -1
A few Good Men:KL:445:5851
11.1.15. Передача результатов сортировки утилите awk
Может возникнуть необходимость по результатам сортировки отобразить небольшое итоговое сообщение. Сделать это легко, если воспользоваться возможностями утилиты awk. В следующем примере сведения о фильме с наименьшим объемом проката за год посредством канала направляются утилите awk, которая дополняет их поясняющим текстом. В качестве разделителя полей в обеих утилитах применяется двоеточие.
$ sort -t: — k4 video.txt | head -1 | \
awk -F: '{print "Worst rental", $1, "has been rented", $3, "times"}'
Worst rental Alien has been rented 119 times
11.1.16. Объединение двух отсортированных файлов
Прежде чем объединять два файла, их необходимо отсортировать, иначе результат будет неотсортированным. Предположим, нам прислали файл video2.txt, содержащий дополнения к уже имеющемуся перечню фильмов, причем этот файл отсортирован:
$ cat video2.txt
Crimson Tide:134:2031 Die Hard:152:2981
Необходимо объединить его с файлом video.txt. Для этого нужно предварительно создать отсортированную версию файла video.txt, которую назовем video.sort, а затем применить команду sort с опцией -m:
$ sort -t: — m -k1 video2.txt video.sort
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Crimson Tide:134:2031
Die Hard:152:2981
Star Wars:HK:301:4102