Программа sort часто вовлекается в обработку табличных данных, таких как результат команды ls выше. Если воспользоваться терминологией баз данных, об этой таблице можно сказать, что каждая строка — это запись и каждая запись состоит из множества полей, таких как атрибуты файла, счетчик ссылок, имя файла, размер файла и т.д. Программа sort способна обрабатывать поля по отдельности. Согласно той же терминологии баз данных, мы можем указать одно или несколько ключевых полей, которые должны использоваться как ключи сортировки. В примере, приведенном выше, мы добавили параметры n и r, чтобы выполнить сортировку по числовым значениям в порядке убывания, а также параметр -k с аргументом 5, чтобы указать, что сортировка должна выполняться по пятому полю.

Параметр очень интересен и обладает множеством любопытных свойств, но прежде чем приступить к их обсуждению, поговорим о том, как sort определяет поля. Рассмотрим очень простой текстовый файл, содержащий единственную строку с именем автора этой книги:

William   Shotts

По умолчанию sort «видит» в этой строке два поля. Первое поле содержит последовательность символов William, второе — последовательность символов Shotts, то есть пробельные символы (пробелы и символы табуляции) интерпретируются как разделители полей, и эти разделители включаются в поле при выполнении сортировки.

Взглянув еще раз на любую строку в выводе нашей команды ls, можно сказать, что она содержит восемь полей и пятое поле хранит размер файла:

-rwxr-xr-x 1 root root 8234216 2012-04-07 17:42 inkscape

Для следующей серии экспериментов возьмем файл с историей выпуска новых версий трех популярных дистрибутивов Linux в период с 2006 по 2008 год. Каждая строка в файле содержит три поля: название дистрибутива, номер версии и дата выпускав формате ММ/ДД/ГГГГ:

SUSE             10.2    12/07/2006

Fedora           10      11/25/2008

SUSE             11.0    06/19/2008

Ubuntu           8.04    04/24/2008

Fedora           8       11/08/2007

SUSE             10.3    10/04/2007

Ubuntu           6.10    10/26/2006

Fedora           7       05/31/2007

Ubuntu           7.10    10/18/2007

Ubuntu           7.04    04/19/2007

SUSE             10.1    05/11/2006

Fedora           6       10/24/2006

Fedora           9       05/13/2008

Ubuntu           6.06    06/01/2006

Ubuntu           8.10    10/30/2008

Fedora           5       03/20/2006

С помощью текстового редактора (например, vim) введите эти данные и сохраните в файле с именем distros.txt.

Далее попробуем отсортировать файл и посмотрим, что из этого получится:

[me@linuxbox ~]$ sort distros.txt

Fedora           10      11/25/2008

Fedora           5       03/20/2006

Fedora           6       10/24/2006

Fedora           7       05/31/2007

Fedora           8       11/08/2007

Fedora           9       05/13/2008

SUSE             10.1    05/11/2006

SUSE             10.2    12/07/2006

SUSE             10.3    10/04/2007

SUSE             11.0    06/19/2008

Ubuntu           6.06    06/01/2006

Ubuntu           6.10    10/26/2006

Ubuntu           7.04    04/19/2007

Ubuntu           7.10    10/18/2007

Ubuntu           8.04    04/24/2008

Ubuntu           8.10    10/30/2008

У нас это почти получилось. Единственная проблема возникла с сортировкой номеров версий Fedora. Так как в лексикографическом смысле 1 предшествует 5, версия 10 оказалась вверху, тогда как версии 9 — внизу.

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

Вот как выглядит синтаксис сортировки по нескольким ключам:

[me@linuxbox ~]$ sort --key=1,1 --key=2n distros.txt

Fedora           5       03/20/2006

Fedora           6       10/24/2006

Fedora           7       05/31/2007

Fedora           8       11/08/2007

Fedora           9       05/13/2008

Fedora           10      11/25/2008

SUSE             10.1    05/11/2006

SUSE             10.2    12/07/2006

SUSE             10.3    10/04/2007

SUSE             11.0    06/19/2008

Ubuntu           6.06    06/01/2006

Ubuntu           6.10    10/26/2006

Ubuntu           7.04    04/19/2007

Ubuntu           7.10    10/18/2007

Ubuntu           8.04    04/24/2008

Ubuntu           8.10    10/30/2008

Перейти на страницу:

Похожие книги