Команды Linux

Команда сортировки Bash

Команда сортировки Bash
Удачи в попытке реализовать алгоритм сортировки в bash, чем закончится до завтра. Не беспокойтесь, вам это не нужно, потому что у вас есть команда сортировки.

С помощью сортировки вы можете упорядочивать файлы в соответствии с порядком в словаре или по числовому значению, рандомизировать строки файлов, удалять повторяющиеся строки и проверять, отсортирован ли файл.

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

Что такое сорт?

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

Параметры команды сортировки для bash

Команда sort имеет 31 вариант (13 основных и 18 отнесенных к другим). Большинство опытных программистов на bash (даже эксперты) знают только несколько основных опций сортировки, необходимых для работы. К другим редко прикасаются. К счастью для вас, у нас есть время коснуться их всех.

Основные параметры сортировки

Это параметры, которые помогают выполнять задачи и сортировать (Сортировка), а также управлять отсортированными результатами (Постобработка) и применять фильтры (Фильтры) перед сортировкой.

Сортировка

Сортировка включает 5 различных типов сортировки. Вот таблица, показывающая каждый тип сортировки с соответствующими параметрами.

Сортировать Короткий вариант / длинный вариант / и т. Д
слово
Числовая сортировка (общая) -g / -general-numeric-sort
общечисловой
поддержка научных обозначений
0.1234e4 = 1234
Числовая сортировка (человек) -h / -человеческая-числовая-сортировка
человеко-числовой
1.234 КБ = 1234
Числовой -n / -числовая сортировка
числовой
… < -1 < 0 < 1 <…
Месяц -М / -месяц-сортировка
месяц
Неизвестный < Jan < Feb <… < Nov < Dec
Случайный -г / -случайная-сортировка
случайный
Версия -V / -версия-сортировка
версия

Обратите внимание, что у каждого типа сортировки есть длинный параметр, оканчивающийся на -sort. В дополнение к определенным параметрам сортировки, параметр -sort = WORD может использоваться для сортировки по словам. Например, -sort = random может использоваться вместо -random-sort или -r.

Примеры

Вот несколько примеров команд сортировки для каждого метода сортировки.

Пример) Сортировка имен

Сортировка не имеет проблем с сортировкой строк по алфавиту. Рассмотрим список известных людей без сортировки.

Функция

известные люди()

curl - тихий https: // www.биографияонлайн.net / люди / известные-100.html
| grep post-content | sed -e 's /<[^>] *.// g '-e' s / Вторая мировая война // g '-e' s / \ (Wilbur \)
/ \ 1 Райт / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'

Командная строка

известные люди | Сортировать

Выход

Стивен Кинг (1947 -)
Стив Джобс (1955 - 2012)
Стинг (1951 -)
Тайгер Вудс (1975 -)
Том Круз (1962 -)
Усэйн Болт (1986 -)
Винчи (1452 - 1519)
Уолт Дисней (1901-1966)
Уилбур Райт (1867-1912)
Вудро Вильсон (1856-1924)

Пример) Общая числовая сортировка

Если нам нужно отсортировать числовые значения с учетом научных обозначений, таких как 99e2, мы можем использовать общую числовую сортировку.

Функция

неотсортированные числовые-значения ()

seq 100 | sort --случайная сортировка | sed '3i 9e2' | сед '3i 99K'

Рассмотрите отсортированный вывод, используя каждый метод. Обратите внимание, что помимо значений от 1 до 100, список также включает «9e12» (900) и «99K» (99000).

Командная строка

неотсортированные числовые значения | sort -n

Выход

96
97
98
99
99 тыс
100

А как насчет 900 и 99000. Правильно, это просто числовая сортировка. Следующий.

Командная строка

неотсортированные числовые значения | sort -h

Выход

96
97
98
99
100
99 тыс

А как насчет 900. Правильно, это просто человеческая числовая сортировка. Следующий.

Командная строка

неотсортированные числовые значения | sort -g

Выход

96
97
98
99
99 тыс
100
9e2

А как насчет 99000. Правильно, это просто обычная числовая сортировка. Как видите, в этом случае нет совместимого метода сортировки; однако это не значит, что вы не можете придумать исправление.

Командная строка

неотсортированные числовые значения | sed 's / [kK] / e3 /' | sort -g

Выход

96
97
98
99
100
9e2
99e3

Теперь это больше похоже на это.

Пример) Сортировка по числовому значению

Если нам нужно отсортировать числовые значения с учетом значений таких обозначений, как K, G, M и E, мы можем использовать числовую сортировку человека.

Командная строка

seq 100 | sort --случайная сортировка | sed '3i 3k' | sort -h

Выход

96
97
98
99
100
3k

Пример) Числовая сортировка

Если все, что нам нужно, это сортировать целые числа, числовая сортировка делает свое дело.

Командная строка

seq 100 | sort --случайная сортировка | sort --numerics-sort

Выход

95
96
97
98
99
100

Пример) Сортировка по месяцам

Сортировка по месяцам позволяет упорядочивать строки по месяцам. Это может оказаться полезным для группировки строк по месяцам, особенно в случае, если опция сортировки по времени недоступна.

Функция

месяцы ()

Кот  <Янв
Фев
Мар
Апр
Может
Июн
Июл
Авг
Сен
Октябрь
Ноя
Декабрь
EOF

Предположим, что месяцы не отсортированы.

Командная строка

месяцев | sort --random-sort

Выход

Мар
Октябрь
Декабрь
Апр
Может
Сен
Авг
Ноя
Июл
Янв
Фев
Июн

Мы всегда можем отсортировать по месяцам.

Командная строка

месяцев | sort --случайная сортировка | sort --month-sort

Выход

Янв
Фев
Мар
Апр
Может
Июн
Июл
Авг
Сен
Октябрь
Ноя
Декабрь

Обратите внимание, что если мы изменим Dec на любую подстроку в ноябре, скажем «Novem», она появится после «Nov» в отсортированном выводе.

Пример) Случайная сортировка - убить чужой терминал

Как и ожидалось, случайная сортировка работает противоположно сортировке, смешивает строки.

Предположим, что в образовательных целях мы хотим убить другого пользователя. Нам нужно будет убедиться, что это не наша точка зрения, и рандомизировать списки, чтобы они были лучше и чтобы мы могли сказать, что точки были выбраны случайным образом.

Команды

сообщение-pty ()


местная птичка;
pty = "$ 1"
;
echo -n "Вы идете вниз"> / dev / $ pty;
для i в 5 4 3 2 1;
делать
сон 1;
echo -n "$ i"> / dev / $ pty;
Выполнено;
echo "Пока!"> / dev / $ pty;
спать 1


пс | grep pty | grep -v -e $ (mypty) | sort --случайная сортировка | голова -1> стандартный ввод;

сообщение-pty $ (pty < stdin );
убить $ (pid < stdin )


Вывод в чужой терминал
Вы идете вниз через 5, 4, 3, 2, 1, пока!]
(выход)

Пример) Сортировка версий - сортировка IPS

Как вы знаете, исходные файлы могут быть версированы с помощью таких строк, как 1.0. Кроме того, версии могут быть более глубокими с номерами версий, такими как 1.0.0, например, в популярных схемах семантических версий.

Сортировка версий позволяет сортировать номера версий. большой! Что теперь? Давай проверим это.

Для этого примера я подготовил сценарий bash для генерации случайных IP-адресов, чтобы нам не приходилось туда идти. Это в репо. Для тех из нас, у кого нет репо, вот быстрый старт.

Команды

git clone https: // github.com / temptemp3 / linuxhint.ком.мерзавец
псевдоним random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '

Теперь, когда вы готовы, приступим.

Командная строка

random-ips 200 | тройник ips

Выход

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41 год.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44 год.214.89.52
185.174.143.111

Хорошо работает. Теперь посмотрим, что произойдет, когда мы попробуем отсортировать IP-адреса.

Командная строка

сортировать IPS

Выход

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

На первый взгляд кажется, что это работает, но строки вроде 8.96.11.181 должен появиться в другом месте.

Команды


для o in d h n V g M
делать
сортировать ips - $ o> ips $ o ,,
Выполнено

эхо все виды равная числовая сортировка
diff ips n, d 1> / dev / null || эхо порядок словаря != числовая сортировка
diff ips n, h 1> / dev / null || эхо человеческая числовая сортировка != числовая сортировка
diff ips n, g 1> / dev / null || эхо общая числовая сортировка != числовая сортировка
diff ips n, v 1> / dev / null ||
эхо версия сортировка != числовая сортировка
show_n_v_ips_diff = "правда"


контрольная работа ! "$ show_n_v_ips_diff" || diff ips n, v

Выход

все виды равные числовые сортировки
порядок словаря != числовая сортировка
сортировка версий != числовая сортировка
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43 год.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

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

Пример) Сортировка версий - сортировка имен файлов по номерам версий

Основываясь на последнем примере, давайте использовать сортировку версий немного ближе к ее предполагаемому использованию. Как вы знаете, номера версий обычно появляются в именах файлов. См. Подробности о сортировке версий.

Во-первых, давайте преобразуем ips в нечто большее, чем исходный файл проекта, например.

Команды

alpha ()
альфа = "abcdefghijklmnopqrstuvwxyz";
echo -n $ альфа: $ ((СЛУЧАЙНОЕ% 26)): 1

beta ()
альфа = "ab";
echo -n $ альфа: $ ((СЛУЧАЙНОЕ% 2)): 1


кошка ips | при чтении -r строка; делать
echo $ (alpha) -v $ line $ (тест $ ((RANDOM% 5)) -eq 0 || beta).деготь.gz;
сделано | тройник глотки

Выход

x-v56.16.109.54.деготь.gz
к-v117.38.14.165a.деготь.gz
d-v87.59.32.91a.деготь.gz
h-v115.215.64.100.деготь.gz
s-v72.174.246.218b.деготь.gz
h-v163.93.19.173.деготь.gz
u-v184.225.11.92b.деготь.gz
y-v205.53.5.211a.деготь.gz
т-v175.196.164.17b.деготь.gz
e-v167.42.221.178b.деготь.gz
c-v126.54.190.189b.деготь.gz
b-v169.180.221.131a.деготь.gz
y-v210.125.170.231a.деготь.gz
x-v71.56.120.9b.деготь.gz

Упражнение

Сделайте приведенные выше команды быстрее с помощью xargs

См. Пример использования команды xargs в сценариях bash.

На этот раз мы даже не будем использовать какие-либо другие методы сортировки.

Командная строка

sort -V sips

Выход

d-v127.100.108.192.деготь.gz
e-v62.140.229.42а.деготь.gz
e-v149.77.211.215a.деготь.gz
e-v167.42.221.178b.деготь.gz
e-v194.189.236.29а.деготь.gz
e-v198.145.199.84b.деготь.gz
e-v240.1.147.196b.деготь.gz
f-v50.100.142.42b.деготь.gz
f-v117.58.230.116.деготь.gz
f-v139.17.210.68b.деготь.gz
f-v153.18.145.133b.деготь.gz
g-v201.153.203.60b.деготь.gz
g-v213.58.67.108.деготь.gz
h-v5.206.37.224.деготь.gz

Теперь вы видите, что сортировка версий может быть полезна при сортировке имен файлов по номерам версий.

Предварительная сортировка

Сортировка имеет четыре основных параметра, которые влияют на фактическую сортировку, а именно -ignore-lead-blanks, -ignore-case, -ignore-nonprinting и -dictionary-order, которые могут перекрываться, а могут и не совпадать. Ниже приведены примеры использования каждого варианта.

Сортировка игнорируя начальные пробелы

Сортировка позволяет игнорировать начальные пробелы ввода как вариант. Начальные пробелы сохраняются в отсортированном выводе.

Вариант

--игнорировать ведущие пробелы

Применение

sort --ignore-lead-blanks

Команды

известные люди> fp
кошка >> fp << EOF
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировать | такс

Выход

Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)

Обратите внимание, что ведущие пробелы в строках, добавленных к fp, появляются первыми в выводе сортировки.

Чтобы исправить это, нам нужно игнорировать ведущие пробелы следующим образом.

Команды

известные люди> fp
кошка >> fp << EOF
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировка --ignore-lead-blanks --ignore-leading-blanks | такс

Выход

Мэрилин Монро (1926-1962)
Мэрилин Монро (1926-1962)
Мария-Антуанетта (1755 - 1793)

Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)

Альтернативы

кот fp | sed 's / ^ \ s * //' | сортировать | такс

Обратите внимание, что альтернатива не сохраняет ведущие пробелы в выводе сортировки.

Сортировка без учета регистра

Сортировка позволяет игнорировать регистр ввода в качестве опции. Регистр сохраняется в отсортированном выводе.

Вариант

--игнорировать регистр

Применение

sort --ignore-case

Команды

известные люди> fp
кошка >> fp << EOF
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировать | такс

Выход

Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)

Обратите внимание, что ведущие пробелы в строках, добавленных к fp, появляются первыми в выводе сортировки.

Чтобы исправить это, нам нужно игнорировать ведущие пробелы следующим образом.

Команды

известные люди> fp
кошка >> fp << EOF
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | sort --ignore-case | такс

Выход

Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)

Альтернативы

кот fp | при чтении -r строка; сделать echo $ line ,,; сделано | сортировать | такс

Обратите внимание, что альтернатива не сохраняет регистр в выводе сортировки.

Сортировка игнорируя непечатаемые

Сортировка позволяет игнорировать ввод без печати в качестве опции. Непечатаемые данные сохраняются в отсортированном выводе.

Вариант

--игнорировать-непечатаемый

Применение

sort --ignore-nonprinting

Команды

известные люди> fp
echo -e "\ x90Abe" >> fp
кот fp | сортировать | такс

Выход

Одри Хепберн (1929 - 1993)
Анджелина Джоли (1975 -)
Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)

Похоже, нам не хватает команды Abe для непечатаемых символов во вводе сортировки.

Чтобы исправить это, нам нужно игнорировать непечатаемые символы.

Команды

известные люди> fp
echo -e "\ x90Abe" >> fp
кот fp | sort --ignore-nonprinting | такс
[/ cc \
Выход
[cc lang = "bash"]
Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
▒Абе

Порядок сортировки словаря

Сортировка позволяет игнорировать весь ввод, кроме пробелов и буквенно-цифровых символов в качестве опции. Ввод сохраняется в отсортированном выводе.

известные люди> fp
echo -e "\ x90Abe" >> fp
кот fp | sort --d | такс

Сортировка сообщений

У сортировки есть одна основная опция, которая не влияет на сортировку, а именно -reverse. Однако это влияет на вывод, позволяя переключать порядок между возрастанием и убыванием. Пример следует.

Сортировка обратного вывода

Сортировка позволяет отображать выходные данные в обратном порядке в качестве опции.

Вариант

--обеспечить регресс

Применение

sort --reverse

Командная строка

известные люди | sort --reverse

Выход

Анджелина Джоли (1975 -)
Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)

Альтернативы

сортировать | такс

Другие варианты сортировки

Есть еще двадцать два варианта сортировки. Примеры следуют.

Проверить сортировку

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

Вариант

--проверять

Применение

сортировать - проверить

Командная строка

seq 10 | sort --случайная сортировка | сортировать - проверить

Выход

сортировка: -: 3: беспорядок: 10

Командная строка

seq 10 | sort --случайная сортировка | сортировать | сортировать - проверить

Выход

(пустой)

Сортировать вывод

Сортировка имеет параметр, который позволяет указать файл для записи вместо использования стандартного вывода или перенаправления. Его использование может улучшить совместимость между средами сценариев.

Вариант

--output = FILE

Применение

sort --output = ФАЙЛ

Командная строка

seq 10 | sort --random-sort --output = random-10

Выход

(пустой)

Сортировка с нулевым завершением

У сортировки есть опция, которая позволяет вам установить разделитель строк на нуль вместо новой строки.

Вариант

--с нулевым окончанием

Применение

sort - с нулевым завершением

Командная строка

seq 10 | tr '\ 012' '\ 000' | sort - с нулевым завершением --random-sort

Выход

25346178910

Сортировка стабильная

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

Вариант

--стабильный

Применение

sort --stable

Командная строка

time seq 1000000 | sort --случайная сортировка | сортировка - стабильный> / dev / null

Выход

реальный 0m9.138 с
пользователь 0m9.201-е годы
sys 0m0.107 с

Размер буфера сортировки

У сортировки есть опция, которая позволяет вам установить объем памяти, используемой в качестве буфера при сортировке. Его можно использовать для ограничения потребления памяти при сортировке больших входов. Это может повлиять на производительность.

Вариант

--размер буфера = РАЗМЕР

Применение

sort --buffer-size = 64

Командная строка

time seq 1000000 | сортировка-случайная-сортировка | sort -stable -buffer-size = 64> / dev / null

Выход

реальный 0m21.685с
пользователь 0m9.858с
sys 0m2.092с

Сортировать по уникальному

Сортировка имеет параметр, позволяющий удалять повторяющиеся строки в выводе сортировки

Вариант

--уникальный

Применение

сорт --уникальный

Командная строка

эхо 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - с нулевым окончанием --unique

Выход

1245

Альтернативы

сортировать | уникальный

Заключение

Сортировка - это внешняя команда, полезная не только при использовании в сочетании с другими внешними командами, но и при использовании с командами без встроенного метода упорядочивания, такими как определяемая пользователем функция или сценарии bash в целом.

Полезные инструменты для геймеров Linux
Если вам нравится играть в игры на Linux, скорее всего, вы использовали приложения и утилиты, такие как Wine, Lutris и OBS Studio, для улучшения игров...
Игры HD Remastered для Linux, ранее не выпускавшиеся для Linux
Многие разработчики и издатели игр придумывают HD-ремастеры старых игр, чтобы продлить жизнь франшизы, порадовать фанатов, требующих совместимости с с...
Как использовать AutoKey для автоматизации игр под Linux
AutoKey - это утилита автоматизации рабочего стола для Linux и X11, запрограммированная на Python 3, GTK и Qt. Используя его функции сценариев и MACRO...