sort

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

sort — це програма Unix-подібних операційних систем, яка повертає текст у відсортованому порядку. Вхідні дані вона отримує через stdin або з файлів які були задані через аргументи. Команда підтримує низку параметрів командного рядка, які можуть відрізнятися залежно від реалізації, котрі керують в якому порядку сортувати дані.

Історія[ред. | ред. код]

Команда sort, яка реалізовувала тривіальне сортування, була вперше реалізована в Multics.[1] Пізніше sort з'явилась у версії UNIX System v1. Її написав Кен Томпсон в AT&T Bell Laboratories. До UNIX System v4 команда sort потребувала опцію назви вхідного файлу, оскільки вона використовувалася для сортування файлів. Потім Томпсон модифікував її для використання конвеєрів. А в UNIX version 5 Томпсон винайшов значення «-» як ім'я файлу, що означало що замість файлу дані для сортування поступатимуть зі стандартного введення. Зараз такий підхід часто використовується в інших командах, таких як tar.

Версія sort, яка включена в GNU coreutils, була написано Майком Хертелем і Полом Еггертом.[2] Ця реалізація використовує алгоритм сортування злиттям.

Подібні команди доступні в багатьох інших операційних системах.

Синтаксис[ред. | ред. код]

sort [ОПЦІї]... [ФАЙЛ]...

Якщо параметр ФАЙЛ відсутній, або коли ФАЙЛ дорівнює -, команда читає дані зі стандартного вводу.

Параметри[ред. | ред. код]

Підтримка опції та функціональності в залежності від дистрибутива.

Name Description Unix Plan 9 Inferno FreeBSD Linux MSX-DOS IBM i
-b,

--ignore-leading-blanks
Ігнорувати пусті символі на початку Так Так Ні Так Так Ні Так
-c не сортувати, а лише перевірити що текст відсортований Ні Так Ні Так Так Ні Так
-C як і -c але не показувати перший невідсортований рядок Ні Ні Ні Так Так Ні Ні
-d,

--dictionary-order
Considers only blanks and alphanumeric characters. Так Так Ні Так Так Ні Так
-f,

--ignore-case
Ігнорувати регістр розкладки Так Так Ні Так Так Ні Так
-g,

--general-numeric-sort,

--sort=general-numeric
Compares according to general numerical value. Так Так Ні Так Так Ні Ні
-h,

--human-numeric-sort,

--sort=human-numeric
Порівнює числові значення з префіксами (тобто 2K 1G) згідно числового значення. Так Ні Ні Так Так Ні Ні
-i,

--ignore-nonprinting
Ігнорує невидимі та спеціальні символи при порівняння. Так Так Ні Так Так Ні Так
-k,

--key=POS1[,POS2]
Start a key at POS1 (origin 1), end it at POS2 (default end of line) Ні Ні Ні Так Так Ні Ні
-m об'єднати завчасно відсортовані файли. Ні Так Ні Так Так Ні Так
-M,

--month-sort,

--sort=month
Порівнювати назви місяців згідно таких правил: (невідомо) < 'JAN' < … < 'DEC'. Так Так Ні Так Так Ні Ні
-n,

--numeric-sort,

--sort=numeric
Порівнювати рядки з числами згідно їх ординального значення. Так Так Так Так Так Ні Так
-o OUTPUT Повертає результат в файл OUTPUT замість стандартного виводу. Ні Так Ні Так Так Ні Так
-r,

--reverse,

/R (MSX-DOS)
Повертає результат в зворотному порядку Так Так Так Так Так Так Так
-R,

--random-sort,

--sort=random
Перемішує результат в випадковому порядку. Дивиться також shuf. Так Ні Ні Так Так Ні Ні
-s Стабілізує сортування, вимикаючи last-resort comparison. Ні Ні Ні Так Так Ні Ні
-S size,

--buffer-size=size
Вказує скільки оперативної пам'яті виділяти для буферизації. Ні Ні Ні Так Ні Ні Ні
-tx Вказує використовувати символ табуляції сепаратором полів. Ні Так Ні Ні Так Ні Так
-t char,

--field-separator=char
Вказує використовувати символ char символом сепаратора полів. Ні Ні Ні Так Так Ні Ні
-T dir,

--temporary-directory=dir
Вказує який каталог використовувати для тимчасових даних . Ні Так Ні Так Так Ні Ні
-u,

--unique
Повертає лише унікальні рядки, в випадку якщо дублюються ключі. Ні Так Ні Так Так Ні Так
-V,

--version-sort
Природне сортування версій згідно значень чисел в розділених крапками. Ні Ні Ні Так Так Ні Ні
-w Like -i, but ignore only tabs and spaces. Ні Так Ні Ні Ні Ні Ні
-z,

--zero-terminated
Вважає що рядок розділяється символом NUL а не Newline Ні Ні Ні Так Так Ні Ні
--help Повертає довідку та виходить Ні Ні Ні Так Так Ні Ні
--version Повертає номер версії та виходить Ні Ні Ні Так Так Ні Ні
/R Повертає результат в зворотному порядку Ні Ні Ні Ні Ні Так Ні
/S Specify the number of digits to determine how many digits of each line should be judged. Ні Ні Ні Ні Ні Так Ні
/A Sort by ASCII code. Ні Ні Ні Ні Ні Так Ні
/H Include hidden files when using wild cards. Ні Ні Ні Ні Ні Так Ні

Приклади[ред. | ред. код]

Сортування файлу в алфавітному порядку[ред. | ред. код]

Нехай у нас є телефонна книга:

$ cat phonebook
ТКАЧЕНКО НАТАЛІЯ     123-1324
БОНДАРЕНКО ОЛЕНА     123-1234
КОВАЛЕНКО ТЕТЯНА     123-3241
МЕЛЬНИК ВОЛОДИМИР    123-2132
ШЕВЧЕНКО ОЛЕКСАНДР   123-3214
КРАВЧЕНКО СЕРГІЙ     123-4321

Відсортуємо її:

$ sort phonebook
БОНДАРЕНКО ОЛЕНА     123-1234
КОВАЛЕНКО ТЕТЯНА     123-3241
КРАВЧЕНКО СЕРГІЙ     123-4321
МЕЛЬНИК ВОЛОДИМИР    123-2132
ТКАЧЕНКО НАТАЛІЯ     123-1324
ШЕВЧЕНКО ОЛЕКСАНДР   123-3214

Це алфавітне сортування, за замовчуванням сортує згідно таблиці кодування UTF-8 (або ASCII для певних значень). В алфавітному сортуванні значення рядка 10 більше ніж 1⁣, але менше ніж 2, тому що 2 порівнюється зі значенням першого символу 1 з рядка 10.

Нехай у нас у файлі numbers рядки з числами 1, 2, 3, 10, 11, 12, 100, 101, 111

$ sort numbers
1
10
100
101
11
111
12
2
3

Сортування за значенням числа[ред. | ред. код]

Опція -n змушує програму сортувати відповідно до числового значення:

$ sort -n numbers
1
2
3
10
11
12
100
101
111

Стовпці, колонки, або поля[ред. | ред. код]

Опція -k використовується для сортування за певним стовпцем. Наприклад " -k 2 " відсортує телефонну книгу за ім'ям, а -k 3 за номером телефона, розглядаючи пробіл (або суміжні пробіли) як, символ що розділяє стовпці (сепаратор).

$ cat phonebook | sort -k 2
МЕЛЬНИК ВОЛОДИМИР    123-2132
ТКАЧЕНКО НАТАЛІЯ     123-1324
ШЕВЧЕНКО ОЛЕКСАНДР   123-3214
БОНДАРЕНКО ОЛЕНА     123-1234
КРАВЧЕНКО СЕРГІЙ     123-4321
КОВАЛЕНКО ТЕТЯНА     123-3241

$ cat phonebook | sort -k 3
БОНДАРЕНКО ОЛЕНА     123-1234
ТКАЧЕНКО НАТАЛІЯ     123-1324
МЕЛЬНИК ВОЛОДИМИР    123-2132
ШЕВЧЕНКО ОЛЕКСАНДР   123-3214
КОВАЛЕНКО ТЕТЯНА     123-3241
КРАВЧЕНКО СЕРГІЙ     123-4321

Сортування у випадковому порядку[ред. | ред. код]

Реалізація GNU має опцію -R --random-sort, кожен запуск такого сортування видає рядки в випадковому порядку, можна сказати що випадково перемішує рядки. Але це не є повністю чесне випадкове перемішування, оскільки воно сортує на основі хешування рядка та випадкових даних, і виводить ідентичні рядки разом. Справжнє випадкове сортування забезпечує утиліта shuf.

Сортувати за версією[ред. | ред. код]

Реалізація GNU має опцію -V --version-sort, це сортування номерів версій в з урахуванням majority, крапки як символу сепаратора, та числового порядку значень, пропускаючи початкові нулі, а також літер що йдуть за числами. Виявляється що це працює і для адрес IPv4.

Примітки[ред. | ред. код]

  1. Multics Commands. www.multicians.org.
  2. sort(1): sort lines of text files - Linux man page. linux.die.net.