Помоћу сортирања можете да наручите датотеке на основу редоследа у речнику или према нумеричкој вредности, насумично редове датотека, уклањање дупликата линија и проверу да ли је датотека сортирана.
Можда ћете моћи да радите и друге ствари с тим, али прво, хајде да бринемо о томе да се умотамо око тога како да користимо сортирање у басх скриптама.
Шта је сортирање?
Сортирање је спољна наредба која спаја датотеке док сортира њихов садржај према типу сортирања и записује резултате сортирања у стандардни излаз.
Сортирај командне опције за басх
Команда за сортирање долази са 31 опцијом (13 главних и 18 категорисаних као остале). Већина искусних басх програмирања (чак и стручњаци) знају само неколико главних опција сортирања потребних за пролазак. Друге ретко кога дотичу. Срећом по тебе имамо времена да их све додирнемо.
Главне опције сортирања
Ово су опције које вам помажу да обавите ствари и сортирате (сортирање), поред манипулације сортираним резултатима (накнадна обрада) и примену филтера (филтери) пре сортирања.
Сортирање
Сортирање долази са 5 различитих врста сортирања. Ево табеле која приказује сваки тип сортирања са повезаним опцијама.
Врста | Кратка опција / дуга опција / итд реч |
Нумеричко сортирање (опште) | -г / -генерал-нумериц-сорт опште-нумерички подршка научном запису 0.1234е4 = 1234 |
Нумеричка сорта (људска) | -х / -људско-нумеричка-сорта људско-нумерички 1.234К = 1234 |
Нумерички | -н / -бројна-сорта нумерички … < -1 < 0 < 1 <… |
Месец дана | -М / -месечно сортирање месец дана Непознат < Jan < Feb <… < Nov < Dec |
Случајно | -р / -рандом-сорт случајни |
Верзија | -В / -верзија-сортирање верзија |
Имајте на уму да свака врста сортирања има дугачку опцију која се завршава са -сорт. Поред одређених опција сортирања, опција -сорт = ВОРД се може користити за сортирање по речи. На пример -сорт = рандом може се користити уместо -рандом-сорт или -р.
Примери
Ево неколико примера наредби за сортирање за сваки метод сортирања.
Пример) Сортирање имена
Сортирање нема проблема са сортирањем редова по абецеди. Размотрите списак познатих људи који нису сортирани.
Функција
познати људи ()цурл - тихо хттпс: // ввв.биограпхионлине.нет / пеопле / кновн-100.хтмл
|. | греп пост-садржај | сед -е 'с /<[^>] *.// г '-е' с / ВВИИ // г '-е' с / \ (Вилбур \)
/ \ 1 Вригхт / '| греп -о -е '\ (\ ([А-З] \ + [.] \?\) \ + [а-з] * \ с \) \ + ([0-9] \ + \ с [^)] \+.'
Командна линија
познати људи | врстаОутпут
Степхен Кинг (1947 -)Стеве Јобс (1955 - 2012)
Стинг (1951 -)
Тигер Воодс (1975 -)
Том Цруисе (1962 -)
Усаин Болт (1986 -)
Винчи (1452 - 1519)
Валт Диснеи (1901 - 1966)
Вилбур Вригхт (1867 - 1912)
Воодров Вилсон (1856 - 1924)
Пример) Опште нумеричко сортирање
Ако треба да сортирамо нумеричке вредности узимајући у обзир научни запис као што је 99е2, можемо користити опште нумеричко сортирање.
Функција
унсортед-нумериц-валуес ()сек 100 | сорт --рандом-сорт | сед '3и 9е2' | сед '3и 99К'
Размотрите сортирани излаз користећи сваку методу. Имајте на уму да поред тога што садржи вредности од 1 до 100, листа укључује и '9е12' (900) и '99К' (99000).
Командна линија
несортиране-нумеричке вредности | сорт -нОутпут
9697
98
99
99К
100
Шта је са 900 и 99000. Тачно, то је само нумеричко сортирање. Следећи.
Командна линија
несортиране-нумеричке вредности | сортирај -хОутпут
9697
98
99
100
99К
Шта је са 900. Тачно, то је само људска нумеричка сорта. Следећи.
Командна линија
несортиране-нумеричке вредности | сорт -гОутпут
9697
98
99
99К
100
9е2
Шта је са 99000. Тачно, то је само општа нумеричка сорта. Као што видите, ниједан метод сортирања у овом случају није компатибилан; међутим, то не значи да не можете да дођете до решења.
Командна линија
несортиране-нумеричке вредности | сед 'с / [кК] / е3 /' | сорт -гОутпут
9697
98
99
100
9е2
99е3
Сад је то више тако.
Пример) Људска нумеричка сорта
Ако треба да сортирамо нумеричке вредности узимајући у обзир значење записа као што су К, Г, М и Е, можемо користити људско нумеричко сортирање.
Командна линија
сек 100 | сорт --рандом-сорт | сед '3и 3к' | сортирај -хОутпут
9697
98
99
100
3к
Пример) Нумеричко сортирање
Ако је потребно само сортирање целих бројева, нумеричко сортирање чини трик.
Командна линија
сек 100 | сорт --рандом-сорт | сорт --нумерицс-сортОутпут
9596
97
98
99
100
Пример) сортирање по месецу
Месечно сортирање вам омогућава редослед редова по месецима. Могло би се показати корисним за груписање линија по месецима, посебно у случају да опција сортирања по времену није доступна.
Функција
месеци ()мачка <
Феб
Мар
Апр
Може
Јун
Јул
Авг
Сеп
Окт
Нема в
Дец
ЕОФ
Претпоставимо да се месеци не сортирају.
Командна линија
месеци | сорт - рандом-сортОутпут
МарОкт
Дец
Апр
Може
Сеп
Авг
Нема в
Јул
Јан
Феб
Јун
Увек можемо сортирати по месецима.
Командна линија
месеци | сорт --рандом-сорт | сорт --монтх-сортОутпут
ЈанФеб
Мар
Апр
Може
Јун
Јул
Авг
Сеп
Окт
Нема в
Дец
Имајте на уму да ако променимо Дец у било који подниз у новембру, рецимо „Новем“, он ће се појавити после „Нов“ у сортираном излазу.
Пример) Случајно сортирање - убити туђи терминал
Као што се и очекивало, случајно сортирање ради супротно од сортирања, меша линије.
Претпоставимо да у образовне сврхе желимо да убијемо другог корисника. Морали бисмо да се уверимо да то није наша штета и да рандомизирамо спискове тако да буду лепши и да можемо рећи да су птис изабрани насумично.
Команде
мессаге-пти ()локални пти;
пти = "$ 1"
;
ецхо -н "Идете доле у"> / дев / $ пти;
за и у 5 4 3 2 1;
урадите
спавање 1;
ецхо -н "$ и"> / дев / $ пти;
Готово;
одјек „Ћао!"> / дев / $ пти;
спавати 1
пс | греп пти | греп -в -е $ (мипти) | сорт --рандом-сорт | глава -1> стдин;
мессаге-пти $ (пти < stdin );
убити $ (пид < stdin )
Излаз на туђем терминалу
Спуштате се за 5 4 3 2 1 Довиђења!]
(излаз)
Пример) Сортирање верзије - сортирање ипс-а
Као што знате, изворне датотеке могу бити верзионисане помоћу низова као што је 1.0. Штавише, верзије могу ићи дубље са бројевима верзија попут 1.0.0 као што се види у популарним семантичким шемама верзија.
Разврставање верзија омогућава сортирање бројева верзија. Велики! Шта сад? Да тестирамо.
За овај пример припремио сам басх скрипту за генерисање случајних ипс-а како не бисмо морали тамо да идемо. У репо је. За оне од нас који немају репо, ево брзог почетка.
Команде
гит клон хттпс: // гитхуб.цом / темптемп3 / линукхинт.цом.гиталиас рандом-ипс = 'тест -ф "линукхинт.цом / генератед-рандом-ипс.сх "; басх $ _ '
Сад кад сте спремни, кренимо.
Командна линија
рандом-ипс 200 | тее ипсОутпут
199.174.177.98180.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
Ок, успева. Сада да видимо шта ће се десити када покушамо да сортирамо ипс.
Командна линија
сортирај ипсОутпут
76.88.194.1578.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 треба да се појави негде другде.
Команде
за о у д х н В г М
урадите
сортирај ипс - $ о> ипс $ о ,,
Готово
одјек свих врста једнак нумеричком сортирању
разлике ипс н, д 1> / дев / нулл || редослед ехо речника != нумеричко сортирање
разлике ипс н, х 1> / дев / нулл || одјек људске нумеричке сорте != нумеричко сортирање
разлике ипс н, г 1> / дев / нулл || одјек опште нумеричко сортирање != нумеричко сортирање
разлике ипс н, в 1> / дев / нулл ||
ецхо версион сорт != нумеричко сортирање
схов_н_в_ипс_дифф = "тачно"
тест ! "$ схов_н_в_ипс_дифф" || разлика ипс н, в
Оутпут
све врсте једнаке нумеричком сортирањуредослед речника != нумеричко сортирање
верзија сортирања != нумеричко сортирање
13,14д12
< 44.221.43.20
< 44.27.108.172
15а14,15
> 44.27.108.172
> 44.221.43.20
27д26
< 84.218.132.51
29ц28
< 87.137.131.40
Као што видите, сортирање верзија вам омогућава сортирање бројева верзија када друге методе сортирања не успеју.
Пример) Сортирање верзије - сортирање имена датотека са бројевима верзија
Надовезујући се на последњи пример, употребимо сортирање верзије мало ближе намени. Као што знате, бројеви верзија се често појављују у именима датотека. Погледајте Детаљи о сортирању верзије.
Прво, претворимо ипс у нешто друго више попут изворне датотеке пројекта.
Команде
алфа ()алфа = "абцдефгхијклмнопкрстуввкиз";
ецхо -н $ алпха: $ ((СЛУЧАЈНИ% 26)): 1
бета ()
алфа = "аб";
ецхо -н $ алпха: $ ((РАНДОМ% 2)): 1
мачка ипс | док се чита -р ред; урадите
ецхо $ (алпха) -в $ лине $ (тест $ ((РАНДОМ% 5)) -ек 0 || бета).катран.гз;
готово | тее гутљаје
Оутпут
к-в56.16.109.54.катран.гзк-в117.38.14.165а.катран.гз
д-в87.59.32.91а.катран.гз
х-в115.215.64.100.катран.гз
с-в72.174.246.218б.катран.гз
х-в163.93.19.173.катран.гз
у-в184.225.11.92б.катран.гз
и-в205.53.5.211а.катран.гз
т-в175.196.164.17б.катран.гз
е-в167.42.221.178б.катран.гз
ц-в126.54.190.189б.катран.гз
б-в169.180.221.131а.катран.гз
и-в210.125.170.231а.катран.гз
к-в71.56.120.9б.катран.гз
Вежбајте
Нека брже раде наредбе помоћу каргс
Погледајте пример како се користи команда каргс у басх скриптама.
Овог пута се нећемо трудити да користимо било који други начин сортирања.
Командна линија
сортирај -В гутљајимаОутпут
д-в127.100.108.192.катран.гзе-в62.140.229.42а.катран.гз
е-в149.77.211.215а.катран.гз
е-в167.42.221.178б.катран.гз
е-в194.189.236.29а.катран.гз
е-в198.145.199.84б.катран.гз
е-в240.1.147.196б.катран.гз
ф-в50.100.142.42б.катран.гз
ф-в117.58.230.116.катран.гз
ф-в139.17.210.68б.катран.гз
ф-в153.18.145.133б.катран.гз
г-в201.153.203.60б.катран.гз
г-в213.58.67.108.катран.гз
х-в5.206.37.224.катран.гз
Сада видите да сортирање верзија може бити корисно при сортирању имена датотека са бројевима верзија.
Претходно сортирај
Сортирање има четири главне опције које утичу на стварно сортирање, наиме, -ноће-водеће-празнине, -игноре-случај, -игноре-неисписивање и -речник-редослед, који се могу и не морају преклапати. Следи пример коришћења сваке опције.
Сортирај занемарујући водеће празнине
Сортирање омогућава занемаривање празних уноса као опције. Водеће празнине су сачуване у сортираном излазу.
Опција
--игнорисати-водеће-празнинеУпотреба
сорт --игноре-водеће-празнинеКоманде
познати људи> фпмачка >> фп << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линцолн (1809 - 1865)
ЕОФ
мачка фп | сортирај | тац
Оутпут
Алфред Хитцхцоцк (1899 - 1980)Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
Мерилин Монро (1926 - 1962)
Абрахам Линцолн (1809 - 1865)
Имајте на уму да се размаци у редовима доданим у фп појављују први у излазу сортирања.
Да бисмо то поправили, потребно је занемарити водеће празнине на следећи начин.
Команде
познати људи> фпмачка >> фп << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линцолн (1809 - 1865)
ЕОФ
мачка фп | сорт --игноре-водеће-празнине --игноре-водеће-празнине | тац
Оутпут
Мерилин Монро (1926 - 1962)Мерилин Монро (1926 - 1962)
Марија Антоанета (1755 - 1793)
…
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
Абрахам Линцолн (1809 - 1865)
Алтернативе
мачка фп | сед 'с / ^ \ с * //' | сортирај | тацИмајте на уму да алтернатива не чува водеће празнине у излазу сортирања.
Сортирај игноришући случај
Сортирање омогућава занемаривање великих и малих слова као опцију. Случај је сачуван у сортираном излазу.
Опција
--игнорисати-случајУпотреба
сорт --игноре-цасеКоманде
познати људи> фпмачка >> фп << EOF
абрахам Линцолн (1809 - 1865)
АБрахам Линцолн (1809 - 1865)
ЕОФ
мачка фп | сортирај | тац
Оутпут
Амелиа Еархарт (1897 - 1937)Алфред Хитцхцоцк (1899 - 1980)
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
АБрахам Линцолн (1809 - 1865)
Имајте на уму да се размаци у редовима доданим у фп појављују први у излазу сортирања.
Да бисмо то поправили, потребно је занемарити водеће празнине на следећи начин.
Команде
познати људи> фпмачка >> фп << EOF
абрахам Линцолн (1809 - 1865)
АБрахам Линцолн (1809 - 1865)
ЕОФ
мачка фп | сорт --игноре-цасе | тац
Оутпут
Амелиа Еархарт (1897 - 1937)Алфред Хитцхцоцк (1899 - 1980)
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
абрахам Линцолн (1809 - 1865)
АБрахам Линцолн (1809 - 1865)
Алтернативе
мачка фп | док се чита -р ред; до ецхо $ лине ,,; готово | сортирај | тацИмајте на уму да алтернатива не чува велика и мала слова у излазу сортирања.
Сортирај занемарујући нештампање
Сортирање омогућава занемаривање уноса без штампања као опцију. Нештампање се чува у сортираном излазу.
Опција
--игнорисати-нештампатиУпотреба
сорт --игноре-нонпринтингКоманде
познати људи> фпецхо -е "\ к90Абе" >> фп
мачка фп | сортирај | тац
Оутпут
Аудреи Хепбурн (1929 - 1993)Ангелина Јолие (1975 -)
Амелиа Еархарт (1897 - 1937)
Алфред Хитцхцоцк (1899 - 1980)
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
Изгледа да нам недостаје „Абе“ за неисписивање знакова у уносу за сортирање.
Да бисмо то поправили, морамо занемарити знакове који се не штампају.
Команде
познати људи> фпецхо -е "\ к90Абе" >> фп
мачка фп | сорт --игноре-нонпринтинг | тац
[/ цц \
Оутпут
[цц ланг = "басх"]
Амелиа Еархарт (1897 - 1937)
Алфред Хитцхцоцк (1899 - 1980)
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
БеАбе
Поредај редослед речника
Сортирање омогућава да се занемарују сви уноси, осим размака и алфанумеричких знакова. Улаз је сачуван у сортираном излазу.
познати људи> фпецхо -е "\ к90Абе" >> фп
мачка фп | сорт --д | тац
Пост сорт
Сортирање има једну главну опцију која не утиче на сортирање, наиме, -реверсе. Међутим, то утиче на излаз, омогућавајући пребацивање редоследа између растућег и силазног. Следи пример.
Сортирај обрнути излаз
Сортирање омогућава приказ резултата у обрнутом редоследу као опцију.
Опција
--обрнутоУпотреба
сорт - реверсеКомандна линија
познати људи | сорт - реверсеОутпут
Ангелина Јолие (1975 -)Амелиа Еархарт (1897 - 1937)
Алфред Хитцхцоцк (1899 - 1980)
Алберт Ајнштајн (1879 - 1955)
Ал Горе (1948 -)
Абрахам Линцолн (1809 - 1865)
Алтернативе
сортирај | тацОстале опције за сортирање
Постоје још двадесет две могућности сортирања. Следе примери.
Сортирај чек
Сортирање има опцију која вам омогућава да проверите да ли је улаз сортиран. Враћа се након прве инстанце неразврстане линије. У случају да је потребно сортирати унос, али је вероватно већ у реду, коришћење провере сортирања је прикладно.
Опција
--провераватиУпотреба
сорт --цхецкКомандна линија
сек 10 | сорт --рандом-сорт | сорт --цхецкОутпут
сортирај: -: 3: поремећај: 10Командна линија
сек 10 | сорт --рандом-сорт | сортирај | сорт --цхецкОутпут
(празно)Сортирај излаз
Сортирање има опцију која вам омогућава да одредите датотеку у коју желите писати, уместо да користите стандардни излаз или преусмеравање. Његова употреба може побољшати компатибилност у окружењима за скриптовање.
Опција
--оутпут = ФИЛЕУпотреба
сорт --оутпут = ФИЛЕКомандна линија
сек 10 | сорт --рандом-сорт --оутпут = рандом-10Оутпут
(празно)Сортирање нулл завршено
Сортирање има опцију која вам омогућава да поставите граничник линије на нулу уместо на нови ред.
Опција
--нула-завршенаУпотреба
врста - нула-завршенаКомандна линија
сек 10 | тр '\ 012' '\ 000' | сорт - нуле-терминатед --рандом-сортОутпут
25346178910Сортирај стабилно
Сортирање има опцију која вам омогућава да онемогућите упоређивање у крајњем случају. Као резултат, могу се постићи стабилнија времена извођења у случају довољно великих улаза због којих би сортирање могло радити нестабилно.
Опција
--стабилноУпотреба
сорт - стаблеКомандна линија
време сек 1000000 | сорт --рандом-сорт | сорт --стабле> / дев / нуллОутпут
реална 0м9.138скорисник 0м9.201с
сис 0м0.107с
Сортирај величину бафера
Сортирање има опцију која вам омогућава да подесите количину меморије која се користи као бафер током сортирања. Може се користити за ограничавање потрошње меморије сортирањем већих улаза. То може утицати на перформансе.
Опција
--величина бафера = ВЕЛИЧИНАУпотреба
сорт --буффер-сизе = 64Командна линија
време сек 1000000 | сорт -рандом-сорт | сорт -стабле -буффер-сизе = 64> / дев / нулл
Оутпут
реалних 0м21.685скорисник 0м9.858с
сис 0м2.092с
Сортирај јединствено
Сортирање има опцију која вам омогућава уклањање дупликата линија у излазу сортирања
Опција
--јединственУпотреба
сорт --уникуеКомандна линија ецхо 1 2 2 4 5 | тр '\ 040' '\ 000' | врста - нула-завршена - јединствена
Оутпут
1245Алтернативе
сортирај | уникЗакључак
Сортирање је спољна команда корисна не само када се користи у комбинацији са другим спољним командама, већ је корисна и када се користи са командама без уграђеног начина наручивања, као што је кориснички дефинисана функција или басх скрипте уопште.