next up previous contents
Next: 7.17 uniq - вывод Up: 7. Программы преобразования и Previous: 7.15 csplit - разделить

7.16 sort - сортировать текстовые файлы

Использование программы:
sort [option]... [file]...
Программа sort сравнивает, объединяет, сортирует вводной поток и выда©т результат на устройство стандартного вывода. В качестве вводного потока может использоваться один или несколько файлов или устройство стандартного ввода. Программа имеет три режима работы: режим сортировки (умолчание), режим слияния, режим проверки отсортирован файл или нет. Переключение в режим слияния и проверки производится следующими параметрами.

-m
Объединить данные файлы сортируя их как одну группу. Каждый вводной файл должен быть уже отсортирован индивидуально. Можно использовать вместо слияния режим сортировки, однако режим слияния там где его возможно использовать выполняется быстрее.

-c
Проверить отсортированы ли уже данные файлы. Если файлы отсортированы, то устанавливается код завершения 0. Если файлы не отсортированы, то выда©тся сообщение об ошибке и устанавливается код завершения 1.

Несколько замечаний о характере сортировки.

Если определены ключевые поля, по которым производится сортировка, то программа сравнивает каждую пару полей в соседних строках в том порядке, в котором это определено в командной строке с уч©том параметров упорядочивания, до того как будет встречено различие либо строки вводного потока═будут исчерпаны.

Если определены любые глобальные параметры сортировки из списка Mbdfinr, но не определены ключевые поля, то программа будет сравнивать полные строки.

Программа GNU sort не имеет ограничений на длину вводной строки или на значения байтов, которые составляют вводную строку. Если возникла любая ошибка, программа завершается с кодом 2. Если установлена переменная окружения TMPDIR, то sort будет использовать это значение как имя каталога, в котором будут располагаться временные файлы. По умолчанию используется имя каталога /tmp. Параметр -T tmpdir, в свою очередь, устанавливает новое значение имени каталога для временных файлов вне зависимости от значения переменной окружения TMPDIR.

Нижеследующие параметры влияют на упорядочивание выводных строк. Они могут быть определены глобально или как часть определ©нного ключевого поля. Если никаких ключевых полей не используется, то глобальные параметры воздействуют на сравнение полных строк. В противном случае глобальные параметры наследуются ключевыми полями, которые не определяют никаких своих специальных параметров.

-b
Игнорировать ведущие пробелы когда производится поиск ключей сортировки в каждой строке.

-d
Сортировать по правилам телефонного справочника: игнорировать все символы, кроме букв, пробелов и цифр.

-f
Рассматривать символы в разных регистрах как одинаковые, например, G и g будут рассматриваться как oдин символ.

-g
Сортировать численно, но использовать strtod, чтобы достичь численных значений. Это позволяет сравнивать числа представленные в формате nnnE+mm. Это очень медленный режим работы, рекомендуется лишь если нет альтернативы. В дополнение числа выходящие за пределы точности двойного слова (8 байтов) рассматриваются как нулевые значения. Никакой диагностики о переполнениях не предусмотрено.

-i
Игнорировать во время сортировки любые символы вне восьмеричных кодов ASCII 040-0176.

-M
Исходные строки в который после любого количества пробелов следуют тр©хбуквенные обозначения месяцев превращаются в верхний регистр и после производится сравнение. Основное правило сравнения таково:
JAN<FEB<MAR<...<DEC. Неверная аббревиатура меньше верной.

-n
Использовать числовые сравнения. Числу в строке может предшествовать сколько угодно пробелов. Числу может предшествовать знак минус. Число может содержать десятичную точку. Число может отсутствовать (состоять из 0 цифр). Не распозна©тся знак плюс и символ экспоненты. Чтобы их распознать используйте параметр -g.

-r
Сортировать в обратном порядке.

Имеются и другие параметры.

-o output-file
Произвести вывод не на устройство стандартного вывода, а в файл с именем output-file. Если имя файла output-file совпадает с именем вводного файла, то программа sort запишет результат сортировки во временный каталог, а потом скопирует результат во вводной файл. Иными словами вводной файл будет в данном случае измен©н.

-t separator
Использовать символ separator как разделитель полей во время поиска сортировочных ключей в каждой строке. По умолчанию поля разделяются пустой строкой между непробельными символами и пробелами. Например, если вводная строка содержит
miru mir
то программа sort разделит е© на два поля "miru" и " mir".

-u
Для случаев по умолчанию или при использовании параметра -m выводит лишь первую из одинаковых строк. Если использован параметр -c, то проверяется, что нет одинаковых подряд идущих строк.

-k pos1[,pos2]
Рекомендованная POSIX форма параметра определяющего сортировочное поле в строке. Поле состоит из символов заключ©нных между pos1 и pos2 или концом строки, если pos2 опущено. Поля и символьные позиции нумеруются начиная с 1.

Позиция внутри строки определяется в форме F.C, где F - номер поля, а C - есть номер символа в поле (слева направо), с которого начинается сортировочный ключ (если +pos). Если имеет место -pos, то отсч©т производится с конца поля. Если C опущено, то подразумевается первый символ поля. Если определ©н параметр -b, то часть C отсчитывается от первого непробельного символа данного поля (если +pos или от первого непробельного символа следующего за предыдущим полем для -pos. Сортировочный ключ может иметь свои параметры сортировки Mbdfinr. В этом случае глобальные параметры сортировки не применяются к данному полю. Параметр -b может быть использован отдельно и независимо для случаев +pos и -pos. Если параметр -b наследуется из глобальных параметров, то он используется во всех случаях. Ключи могут включать несколько полей. Ниже смотрите примеры сортировки.

-z
Обработать вводной поток как набор строк, каждая из которых заканчивается символом <NUL>, а не <LF>. Этот параметр может оказаться полезным в специальных случаях, например, вместе с perl -0 или find -print0 или xargs -0.

Отсортировать численно в обратном порядке (в сторону уменьшения значения чисел):
ps | sort -rn
вы получите список ваших процессов упорядоченный по номеру процесса, максимальный номер будет вверху.

Отсортировать в алфавитном порядке опустив при этом первые 10 полей.
ps ux | sort -k 11
вы получите упорядоченный по алфавиту по 11-ому полю (имя программы в RedHat 5.1) список.

Отсортировать по алфавиту файл /etc/passwd по второй букве поля комментариев, а с одинаковыми вторыми символами отсортировать по первой букве
sort -t : -k 5.2,5.2 -k 5.1,5.1 /etc/passwd
Заметим, что если написать не 5.2,5.2, а просто 5.2, то в качестве сортировочного ключа будет взято пятое поле начиная с символа 2 (напомним, нумерация начинается с 1).

Отсортировать по алфавиту файл /etc/passwd по полю пять игнорируя лидирующие пробелы, а═поля с равными значениями сортировать по числовому значению в сторону уменьшения по полю 3
sort -t : -k 5b,5 -k 3,3rn /etc/passwd
Заметим, что запись -5b,5 означает произвести сортировку по полю 5. Если написать просто -5b, то в качестве ключа сортировки будет использована часть строки начиная с поля 5 до конца строки. Наконец, чтобы игнорировать как лидирующие пробелы в поле, так и замыкающие пробелы поля, можно записать
sort -t : -k 5b,5b -k 3,3rn /etc/passwd
или использовать глобальный параметр -b
sort -t : -b -k 5,5 -k 3,3rn /etc/passwd


next up previous contents
Next: 7.17 uniq - вывод Up: 7. Программы преобразования и Previous: 7.15 csplit - разделить
Andrei Chevel
Andrei.Chevel@pnpi.spb.ru