Чтение онлайн

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

Toy Story:HK:239:3972

Alien:HK:119:1982

Вот что получится в результате применения команды sort -u:

$ sort -и video.txt

A Few Good Men:KL:445:5851

Alien:HK:119:1982

Aliens:HK:532;4892

Boys in Company С: НК:192:2192

Star Wars:HK:301:4102

The Hill:KL:63:2972

Toy Story:HK:239:3972

11.1.11. Задание ключа сортировки с помощью опции -k

Команда sort позволяет задать ключ сортировки немного по–другому. Если воспользоваться опцией — к, то поля (ключи

сортировки) можно будет нумеровать, начиная с единицы, а не с нуля, что, в принципе, удобнее. Таким образом, чтобы выполнить сортировку по полю 4, достаточно задать опцию -k4n. Это позволит упорядочить список фильмов по объемам видеопроката за год.

$ sort -t: — k4n video.txt

Alien:HK:119:l982

Boys in Company C:HK:192:2192

The Hill:KL:63:2972

Toy Story:HK:239:3972

Star Wars:HK:30l:4102

Aliens:HK:532:4892

A Few Good Men:KL:445:5851

11.1.12. Несколько ключей сортировки

При использовании опций +позиция и -k следует быть особенно аккуратным. Если вы внимательно прочитали их описание в табл. 11.1, то должны были отметить такой факт: когда не указана конечная позиция, ключ сортировки считается заканчивающимся в конце строки. Подобная тонкость обычно вводит в замешательство новичков, которые пытаются выполнять числовую сортировку или сортировку с несколькими ключами. Если, к примеру, вы ссылаетесь на числовое поле только по номеру, а это поле не является последним в строке, причем за ним идут текстовые поля, данное поле также будет проинтерпретировано как текстовое, вследствие чего будут получены неправильные результаты.

Схожая проблема возникает при работе с несколькими ключами сортировки. Рассмотрим такой пример. Предположим, требуется отсортировать список фильмов по кодам дистрибьюторов (второе поле), а затем по названиям фильмов (первое поле). Если сослаться на поля по номерам, получим следующее:

$ sort -t: — k2 -kl video.txt

Alien:HK.119:1982

Boys in Company C: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

Здесь ссылка на первое поле в действительности означает ссылку на всю строку, т. е. ключ с меньшим приоритетом включает в себя ключ с большим приоритетом, поэтому команда 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

Поделиться с друзьями: