Linux команди

Команда за сортиране на баш

Команда за сортиране на баш
Успех в опитите да внедрите алгоритъм за сортиране в bash, отколкото завършва преди утре. Не се притеснявайте, не е нужно, защото имате командата за сортиране.

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

Може да можете да правите други неща с него, но първо, нека се притесняваме да си увием главите как да използваме сортирането в bash скриптове.

Какво е сортиране?

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

Сортирайте командните опции за bash

Командата за сортиране се предлага с 31 опции (13 основни и 18 категоризирани като други). Повечето опитни програмисти на bash (дори експерти) знаят само няколко основни опции за сортиране, необходими за преминаване. Други рядко се докосват. За ваш късмет имаме време да ги докоснем всички.

Основни опции за сортиране

Това са опциите, които ви помагат да свършите нещата и да сортирате (Сортиране) в допълнение към манипулирането на сортираните резултати (Последваща обработка) и прилагането на филтри (Филтри) преди сортирането.

Сортиране

Сортирането се предлага с 5 различни вида сортиране. Ето таблица, показваща всеки тип сортиране със свързани опции.

Вид Кратка опция / дълга опция / и т.н
дума
Числово сортиране (общо) -g / -общо-числово-сортиране
общо-числови
подкрепа за научна нотация
0.1234e4 = 1234
Числово сортиране (човешко) -h / -human-numeric-sort
човешки-числови
1.234K = 1234
Числови -n / -numeric-sort
числови
.. < -1 < 0 < 1 <…
Месец -M / -месечно сортиране
месец
Неизвестно < Jan < Feb <… < Nov < Dec
Случайни -r / -random-sort
случайни
Версия -V / -version-sort
версия

Имайте предвид, че всеки тип сортиране има дълга опция, завършваща с -sort. В допълнение към конкретни опции за сортиране, опцията -sort = WORD може да се използва за сортиране по дума. Например -sort = random може да се използва вместо -random-sort или -r.

Примери

Ето някои примери за команди за сортиране за всеки метод за сортиране.

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

Сортирането няма проблеми със сортирането на редове по азбучен ред. Помислете за списък на известни хора, които не са сортирани.

Функция

известни хора()

curl --silent https: // www.биография онлайн.net / people / known-100.html
| grep след съдържание | sed -e 's /<[^>] *.// g '-e' s / WWII // 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, можем да използваме общо числово сортиране.

Функция

unsorted-numeric-values ​​()

сл. 100 | сортиране - произволно сортиране | sed '3i 9e2' | sed '3i 99K'

Помислете за сортирания изход, като използвате всеки метод. Имайте предвид, че в допълнение към съдържанието на стойности от 1 до 100, списъкът включва също „9e12“ (900) и „99K“ (99000).

Командна линия

несортирани числови стойности | сортиране -n

Изход

96
97
98
99
99 000
100

Ами 900 и 99000. Точно така, просто е числово сортиране. Следващия.

Командна линия

несортирани числови стойности | сортиране -h

Изход

96
97
98
99
100
99 000

Ами 900. Точно така, това е просто човешко числово сортиране. Следващия.

Командна линия

несортирани числови стойности | сортиране -g

Изход

96
97
98
99
99 000
100
9е2

Ами 99000. Точно така, това е просто общо числово сортиране. Както виждате, в този случай няма метод за сортиране; това обаче не означава, че не можете да излезете с решение.

Командна линия

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

Изход

96
97
98
99
100
9е2
99е3

Сега това е по-скоро така.

Пример) Човешко числово сортиране

Ако трябва да сортираме числови стойности, като вземем предвид значението на обозначения като K, G, M и E, можем да използваме човешко числово сортиране.

Командна линия

сл. 100 | сортиране - произволно сортиране | sed '3i 3k' | сортиране -h

Изход

96
97
98
99
100
3k

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

Ако всичко, от което се нуждаем, е да сортираме цели числа, числовото сортиране върши работа.

Командна линия

сл. 100 | сортиране - произволно сортиране | sort --numerics-sort

Изход

95
96
97
98
99
100

Пример) Месечно сортиране

Месечното сортиране ви позволява да поръчате редове по месец. Може да се окаже полезно за групиране на редове заедно по месец, особено в случай, че опцията за сортиране по време не е налична.

Функция

месеци ()

котка  <Януари
Февр
Март
Април
Може
Юни
Юли
Август
Септември
Октомври
Ноем
Дек
EOF

Да предположим, че месеците не са сортирани.

Командна линия

месеци | сортиране - произволно сортиране

Изход

Март
Октомври
Дек
Април
Може
Септември
Август
Ноем
Юли
Януари
Февр
Юни

Винаги можем да сортираме по месец.

Командна линия

месеци | сортиране - произволно сортиране | сортиране - месец-сортиране

Изход

Януари
Февр
Март
Април
Може
Юни
Юли
Август
Септември
Октомври
Ноем
Дек

Имайте предвид, че ако променим Dec на който и да е подниз през ноември да кажем „Novem“, той ще се появи след „Nov“ в сортирания изход.

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

Както се очаква, произволното сортиране прави обратното на сортирането, смесва линии.

Да предположим, че за образователни цели искаме да убием друг потребител. Трябва да се уверим, че това не е нашето мнение и да рандомизираме списъците, така че да е по-хубаво и да можем да кажем, че ptys са избрани на случаен принцип.

Команди

message-pty ()


местен pty;
pty = "$ 1"
;
echo -n "Ще влезете в"> / dev / $ pty;
за i в 5 4 3 2 1;
направете
сън 1;
echo -n "$ i"> / dev / $ pty;
Свършен;
ехо "Чао!"> / dev / $ pty;
сън 1


ps | grep pty | grep -v -e $ (mypty) | сортиране - произволно сортиране | глава -1> stdin;

message-pty $ (pty < stdin );
убий $ (pid < stdin )


Изход в чужд терминал
Слизаш след 5 4 3 2 1 Чао!]
(изход)

Пример) Сортиране на версия - ips за сортиране

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

Сортирането на версията ви позволява да сортирате номерата на версиите. Страхотен! Сега какво? Нека да го тестваме.

За този пример съм подготвил bash скрипт за генериране на произволни ips, за да не се налага да ходим там. Това е в репото. За тези от нас, които нямат репо, ето бърз старт.

Команди

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

Сега, когато сте готови, нека започнем.

Командна линия

произволни 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

Добре, работи. Сега нека видим какво се случва, когато се опитаме да сортираме ips.

Командна линия

сортиране на 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 в 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
15а14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29с28
< 87.137.131.40

Както виждате, сортирането на версиите ви позволява да сортирате номерата на версиите, когато други методи за сортиране са неуспешни.

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

Надграждайки последния пример, нека използваме сортиране на версията малко по-близо до предназначението. Както знаете, номерата на версиите често се появяват в имената на файловете. Вижте Подробности за сортирането на версията.

Първо, нека трансформираме ips в нещо друго, по-скоро като изходен файл на проекта.

Команди

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

бета ()
алфа = "ab";
echo -n $ alpha: $ ((СЛУЧАЙЕН% 2)): 1


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

Изход

x-v56.16.109.54.катран.gz
k-v117.38.14.165а.катран.gz
d-v87.59.32.91а.катран.gz
h-v115.215.64.100.катран.gz
s-v72.174.246.218б.катран.gz
h-v163.93.19.173.катран.gz
u-v184.225.11.92б.катран.gz
y-v205.53.5.211а.катран.gz
t-v175.196.164.17б.катран.gz
e-v167.42.221.178б.катран.gz
c-v126.54.190.189б.катран.gz
b-v169.180.221.131а.катран.gz
y-v210.125.170.231а.катран.gz
x-v71.56.120.9б.катран.gz

Упражнение

Направете горните команди да работят по-бързо с помощта на xargs

Вижте пример за това как да използвате командата xargs в bash скриптове.

Този път дори няма да се притесняваме да използваме някой от другите методи за сортиране.

Командна линия

сортиране -V глътки

Изход

d-v127.100.108.192.катран.gz
e-v62.140.229.42а.катран.gz
e-v149.77.211.215а.катран.gz
e-v167.42.221.178б.катран.gz
e-v194.189.236.29а.катран.gz
e-v198.145.199.84б.катран.gz
e-v240.1.147.196b.катран.gz
f-v50.100.142.42б.катран.gz
f-v117.58.230.116.катран.gz
f-v139.17.210.68б.катран.gz
f-v153.18.145.133б.катран.gz
g-v201.153.203.60б.катран.gz
g-v213.58.67.108.катран.gz
h-v5.206.37.224.катран.gz

Сега виждате, че сортирането на версиите може да бъде полезно при сортиране на имена на файлове с номера на версиите.

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

Сортирането има четири основни опции, които засягат действителното сортиране, а именно: -ignore-водещи-заготовки, -ignore-case, -ignore-nonprinting и -dictionary-order, които могат или не могат да се припокриват. Следвайте пример с използване на всяка опция.

Сортирайте, игнорирайки водещите заготовки

Сортирането позволява като опция да се игнорират водещите заготовки. Водещите заготовки се запазват в сортирания изход.

Вариант

--игнориране на водещи заготовки

Употреба

sort --ignore-водещи заготовки

Команди

известни хора> fp
котка >> fp << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране | tac

Изход

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

Имайте предвид, че водещите интервали в редове, добавени към fp, се появяват първи в изхода за сортиране.

За да поправим това, трябва да игнорираме водещите заготовки, както следва.

Команди

известни хора> fp
котка >> fp << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране --ignore-водещи-заготовки --ignore-водещи-заготовки | tac

Изход

Мерилин Монро (1926 - 1962)
Мерилин Монро (1926 - 1962)
Мария Антоанета (1755 - 1793)
..
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)

Алтернативи

котка fp | sed 's / ^ \ s * //' | сортиране | tac

Обърнете внимание, че алтернативата не запазва водещи празни места в изхода за сортиране.

Сортирай игнорирайки случая

Сортирането позволява да се игнорира входния регистър като опция. Случаят е запазен в сортирания изход.

Вариант

--ignore-case

Употреба

sort --ignore-case

Команди

известни хора> fp
котка >> fp << EOF
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране | tac

Изход

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

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

За да поправим това, трябва да игнорираме водещите заготовки, както следва.

Команди

известни хора> fp
котка >> fp << EOF
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | sort --ignore-case | tac

Изход

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

Алтернативи

котка fp | докато чете -r ред; do echo $ линия ,,; готово | сортиране | tac

Имайте предвид, че алтернативата не запазва регистъра в изхода за сортиране.

Сортиране, игнорирайки непечат

Сортирането позволява да се игнорира въвеждането без отпечатване като опция. Неотпечатването се запазва в сортирания изход.

Вариант

--игнориране-непечат

Употреба

sort --ignore-nonprinting

Команди

известни хора> fp
echo -e "\ x90Abe" >> fp
котка fp | сортиране | tac

Изход

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

Изглежда, че при въвеждането на сортирането липсва „Abe“ за непечатащи символи.

За да поправим това, трябва да игнорираме непечатащи символи.

Команди

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

Сортирайте реда на речника

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

известни хора> fp
echo -e "\ x90Abe" >> fp
котка fp | сортиране --d | tac

Сортиране на публикацията

Сортирането има една основна опция, която не засяга сортирането, а именно -reverse. Това обаче влияе на изхода, позволявайки превключване на реда между възходящ и низходящ. Следва пример.

Сортирайте обратния изход

Сортирането позволява опцията да се показва в обратен ред като опция.

Вариант

--обратен

Употреба

сортиране - обратно

Командна линия

известни хора | сортиране - обратно

Изход

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

Алтернативи

сортиране | tac

Други опции за сортиране

Има двадесет и две други опции за сортиране. Следват примери.

Проверка за сортиране

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

Вариант

--проверете

Употреба

сортиране - проверка

Командна линия

сл. 10 | сортиране - произволно сортиране | сортиране - проверка

Изход

сортиране: -: 3: разстройство: 10

Командна линия

сл. 10 | сортиране - произволно сортиране | сортиране | сортиране - проверка

Изход

(празно)

Сортирайте изхода

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

Вариант

--изход = ФАЙЛ

Употреба

сортиране - изход = ФАЙЛ

Командна линия

сл. 10 | sort --random-sort --output = random-10

Изход

(празно)

Сортиране нула прекратено

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

Вариант

--с нулев край

Употреба

сортиране - нулев край

Командна линия

сл. 10 | tr '\ 012' '\ 000' | сортиране - нулев край - произволно сортиране

Изход

25346178910

Сортирайте стабилно

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

Вариант

--стабилен

Употреба

сортиране - стабилно

Командна линия

време sq 1000000 | сортиране - произволно сортиране | сортиране --стабилно> / dev / null

Изход

реално 0m9.138s
потребител 0m9.201s
sys 0m0.107s

Сортирай размера на буфера

Сортирането има опция, която ви позволява да зададете размера на паметта, използвана като буфер по време на сортиране. Може да се използва за ограничаване на консумацията на памет при сортиране на по-големи входове. Производителността може да бъде засегната.

Вариант

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

Употреба

sort --buffer-size = 64

Командна линия

време sq 1000000 | сортиране -случайно сортиране | сортиране -стабилен-буфер-размер = 64> / dev / null

Изход

реално 0m21.685s
потребител 0m9.858s
sys 0m2.092s

Сортирайте уникално

Сортирането има опция, която ви позволява да премахнете дублиращи се редове в изхода за сортиране

Вариант

--единствен по рода си

Употреба

сортиране --уникално

Командна линия

ехо 1 2 2 4 5 | tr '\ 040' '\ 000' | сортиране - нулев край - уникален

Изход

1245

Алтернативи

сортиране | uniq

Заключение

Сортирането е външна команда, полезна не само когато се използва в комбинация с други външни команди, но също така е полезна, когато се използва с команди без вграден метод за подреждане, като дефинирана от потребителя функция или bash скриптове като цяло.

Топ 5 продукти за ергономична компютърна мишка за Linux
Продължителната употреба на компютър причинява ли болка в китката или пръстите? Страдате ли от схванати стави и постоянно ли ви се налага да си ръкува...
Как да променяте настройките на мишката и тъчпада с помощта на Xinput в Linux
Повечето дистрибуции на Linux се доставят с библиотека “libinput” по подразбиране за обработка на входни събития в системата. Той може да обработва вх...
Пренастройте бутоните на мишката си по различен начин за различен софтуер с X-Mouse Button Control
Може би се нуждаете от инструмент, който може да промени контрола на мишката с всяко приложение, което използвате. Ако случаят е такъв, можете да изпр...