{"id":83055,"date":"2020-05-28T01:42:15","date_gmt":"2020-05-27T23:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki"},"modified":"2020-05-28T01:42:15","modified_gmt":"2020-05-27T23:42:15","slug":"kak-linuxovskij-sort-sortiruet-stroki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Kuidas Linuxi sort funktsioon sorteerib ridu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Sissejuhatus<\/h1>\n<p><\/p>\n<p>K\u00f5ik algas l\u00fchikesest skriptist, mis pidi \u00fchendama teavet aadresside <em>e-mail<\/em> t\u00f6\u00f6tajatest, mis saadud meililisti kasutajate loendist, koos t\u00f6\u00f6tajate ametikohtadega, mis saadud personaliosakonna andmebaasist. M\u00f5lemad loendid eksportiti tekstifailidena Unicode'i kodeeringus <em>UTF-8<\/em> ja salvestati unixi l\u00f5ppudega.<\/p>\n<p><\/p>\n<p>Sisu <em>mail.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov Andre;ia@example.com<\/code><\/pre>\n<p><\/p>\n<p>Sisu <em>buhg.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanova Alla;maaler\nJolkin Ella;kraanajuht\nIvanov Andre;torumees\nAbakanov Mihail;maaler<\/code><\/pre>\n<p><\/p>\n<p>Failide \u00fchendamiseks sortsiti failid unixi k\u00e4su abil <em>sort<\/em> ja edastati unixi programmile <em>join<\/em>, mis l\u00f5petas ootamatult t\u00f5rke t\u00f5ttu: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt &gt; buhg.srt\n$&gt; sort mail.txt &gt; mail.srt\n$&gt; join buhg.srt mail.srt &gt; result\njoin: buhg.srt:4: pole sorteeritud: Ivanov Andre;torumees<\/code><\/pre>\n<p><\/p>\n<p>Sorteerimise tulemus n\u00e4gi silmaga vaadates v\u00e4lja \u00f5ige, kuid meeste ja naiste perekonnanimede kokkulangemisel on naised enne mehi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Mihail;maaler\nJolkin Ella;kraanajuht\nIvanova Alla;maaler\nIvanov Andre;torumees<\/code><\/pre>\n<p><\/p>\n<p>Tundub, et see on unicode'i sortimise viga v\u00f5i naiste \u00f5iguste manifestatsioon sortimise algoritmis. Esimene tundub muidugi usutavam.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>J\u00e4tame hetkel k\u00f5rvale <em>join<\/em> ja keskendume <em>sort<\/em>. Proovime lahendada \u00fclesande teadlikult eksitades. Alustuseks muudame lokaali <em>en_US<\/em> . Tundub, et <em>ru_RU<\/em>. Sorteerimiseks piisaks keskkonnamuutuja seadmisest <em>LC_COLLATE<\/em>, aga me ei hakka pisiasju ajama:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Mihail;maaler\nJolkin Ella;kraanajuht\nIvanova Alla;maaler\nIvanov Andre;torumees<\/code><\/pre>\n<p><\/p>\n<p>Miski ei muutunud.<\/p>\n<p><\/p>\n<p>Proovime faile \u00fchekordse kodeeringusse edastada: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t KOI8-R buhg.txt \n | LANG=ru_RU.KOI8-R sort \n | iconv -f KOI8-R -t UTF8<\/code><\/pre>\n<p><\/p>\n<p>Taaskord ei muutunud miski.<\/p>\n<p><\/p>\n<p>Mitte midagi teha, tuleb otsida lahendust internetist. Otse vene perekonnanimede kohta ei ole midagi, kuid on k\u00fcsimusi teiste sorteerimise veidrustega. N\u00e4iteks selline probleem: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">Unix sort k\u00e4sitleb &#8216;-&#8216; (kriips) s\u00fcmboleid n\u00e4htamatute teadetena<\/a><\/noindex>. L\u00fchidalt \u00f6eldes, stringid &quot;a-b&quot;, &quot;aa&quot;, &quot;ac&quot; j\u00e4rjestatakse nagu &quot;aa&quot;, &quot;a-b&quot;, &quot;ac&quot;.<\/p>\n<p><\/p>\n<p>Vastus on k\u00f5ikjal standardne: kasutage programmeerija lokaali <em>&quot;C&quot;<\/em> ja teil on \u00f5nne. Proovime:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJolkin Ella;kraanajuht\nAbakanov Mihail;maaler\nIvanov Andre;torumees\nIvanova Alla;advokaat<\/code><\/pre>\n<p><\/p>\n<p>Midagi on muutunud. Ivanovid on \u00f5iges j\u00e4rjekorras, t\u00f5epoolest on Jolkin kuhugi kadunud. Naaseme algse \u00fclesande juurde:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt &gt; buhg.srt\n$&gt; LANG=C sort mail.txt &gt; mail.srt\n$&gt; LANG=C join buhg.srt mail.srt &gt; result<\/code><\/pre>\n<p><\/p>\n<p>See toimis ilma vigadeta, nagu lubas internet. Ja see k\u00f5ik vaatamata \u0401lkina esimeses reas.<\/p>\n<p><\/p>\n<p>Probleem n\u00e4ib olevat lahendatud, kuid igaks juhuks proovime veel \u00fchte vene kodeeringut \u2014 Windowsi kodeeringut <em>CP1251<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t CP1251 buhg.txt \n | LANG=ru_RU.CP1251 sort \n | iconv -f CP1251 -t UTF8 <\/code><\/pre>\n<p><\/p>\n<p>Sorteerimise tulemus, ootamatult, vastab lokaalile <em>&quot;C&quot;<\/em>, ja kogu n\u00e4ide, vastavalt, l\u00e4bib veatut. Miski m\u00fcstiline.<\/p>\n<p><\/p>\n<p>Ma ei armasta m\u00fcstikat programmeerimises, kuna tavaliselt varjab see vigu. Pean t\u00f5siselt tegelema k\u00fcsimusega, kuidas see t\u00f6\u00f6tab <em>sort<\/em> ja millele see m\u00f5jutab <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>L\u00f5pus p\u00fc\u00fcan vastata k\u00fcsimustele:<\/p>\n<p><\/p>\n<ul>\n<li>miks naiste perekonnanimesid sorteeriti valesti<\/li>\n<li>miks <em>LANG=ru_RU.CP1251<\/em> osutus ekvivalentseks <em>LANG=C<\/em><\/li>\n<li>miks on <em>sort<\/em> ja <em>join<\/em> erinevad arusaamad sorteeritud ridade j\u00e4rjestusest<\/li>\n<li>miks on k\u00f5igis minu n\u00e4idetes vead<\/li>\n<li>l\u00f5puks, kuidas sorteerida ridu oma maitse j\u00e4rgi<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">Sorteerimine UTF-8 formaadis<\/h1>\n<p><\/p>\n<p>Esimene peatus on tehniline aruanne nr 10 pealkirjaga <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Unicode collation algorithm<\/a><\/noindex> veebisaidil <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org<\/a><\/noindex>. Aruanne sisaldab palju tehnilisi detaile, nii et luban endale tuua l\u00fchikese \u00fclevaate p\u00f5hiteesidest.<\/p>\n<p><\/p>\n<p><em>V\u00f5rdlemine<\/em> \u2014 &quot;stringide v\u00f5rreldamine&quot; on iga sorteerimisalgoritmi alus. Algoritmid v\u00f5ivad erineda (&quot;puhumise&quot;, &quot;liitmise&quot;, &quot;kiire&quot;), kuid k\u00f5ik nad kasutavad paari stringi v\u00f5rdlemist, et m\u00e4\u00e4rata nende j\u00e4rjekorda.<\/p>\n<p><\/p>\n<p>Ridade sorteerimine loomulikus keeles on \u00fcsna keeruline probleem. Isegi k\u00f5ige lihtsamates \u00fchebaidistes kodeeringutes ei vasta t\u00e4htede j\u00e4rjekord t\u00e4hestikus, mis on mingil m\u00e4\u00e4ral erinev ingliskeelsest, juba numbrilistele v\u00e4\u00e4rtustele, millega need t\u00e4hed kodeeritakse. Nii on saksa t\u00e4hestikus t\u00e4ht <em>\u00d6<\/em> paikneb kui <em>O<\/em> ja <em>P<\/em>, ja kodeeringus <em>CP850<\/em> sattub see vahele <em>\u00ff<\/em> ja <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>Saame proovida eraldada end konkreetsetest kodeeringutest ja k\u00e4sitleda &quot;ideaalsetest&quot; t\u00e4htedest, mis on paigutatud mingisse j\u00e4rjestusse, nagu see on tehtud Unicode'is. Kodeeringud <em>UTF8<\/em>, <em>UTF16<\/em> v\u00f5i \u00fchebaidine <em>KOI8-R<\/em> (kui on vaja piiratud alams\u00fcsteemi UTF-8-st) annavad erinevad numbrilised esitlused t\u00e4htedele, kuid viitavad samadele elementidele p\u00f5hitaabelis. <\/p>\n<p><\/p>\n<p>Selgub, et isegi nullist s\u00fcmbolite tabeli koostamine ei v\u00f5imalda meil m\u00e4\u00e4rata universaalset s\u00fcmbolite j\u00e4rjekorda. Erinevates rahvuslikes t\u00e4hestikes, mis kasutavad samu t\u00e4hti, v\u00f5ib nende t\u00e4htede j\u00e4rjekord erineda. N\u00e4iteks prantsuse keeles <em>\u00c6<\/em> loetakse ligatuuriks ja sorteeritakse nagu string <em>AE<\/em>. Norra keeles <em>\u00c6<\/em> loetakse eraldi t\u00e4hiseks, mis asub p\u00e4rast <em>Z<\/em>. Muide, lisaks ligatuuride t\u00fc\u00fcpidele <em>\u00c6<\/em> on olemas ka t\u00e4hed, mis on kirjutatud mitme s\u00fcmboliga. Tshehhi t\u00e4hestikus on t\u00e4ht <em>Ch<\/em>, mis asub kahe vahel <em>H<\/em> ja <em>I<\/em>.<\/p>\n<p><\/p>\n<p>Lisaks t\u00e4hestike erinevusele on olemas ka muid rahvuslikke traditsioone, mis m\u00f5jutavad sortimist. Eelk\u00f5ige tekib k\u00fcsimus: millises j\u00e4rjekorras peaksid s\u00f5naraamatus olema s\u00f5nad, mis koosnevad suurtest ja v\u00e4ikestest t\u00e4htedest? Samuti v\u00f5ivad sortimist m\u00f5jutada kirjavahem\u00e4rgi kasutamise erip\u00e4rad. Hispaania keeles asetatakse k\u00fcsimuse ette p\u00f6\u00f6ratud k\u00fcsim\u00e4rk (<em>\u00bfTe gusta la m\u00fasica?<\/em>). Sel juhul on selge, et k\u00fcsimused ei tohiks r\u00fchmituda eraldi klastrisse v\u00e4ljaspool t\u00e4hestikku, vaid kuidas sorteerida stringe koos teiste kirjavahem\u00e4rkidega?<\/p>\n<p><\/p>\n<p>Ma ei hakka peatuma stringide sortimisel keeltes, mis oluliselt erinevad Euroopa keeltest. Tahan m\u00e4rkida, et keeltes, kus kirjutamise suund on paremalt vasakule v\u00f5i \u00fclalti alla, hoitakse t\u00f5en\u00e4oliselt stringide s\u00fcmboleid lugemise j\u00e4rjekorras ning isegi mitte-t\u00e4hestikulistes kirjutistes on oma meetodid stringide s\u00fcmbolite j\u00e4rjekorda seadmiseks. N\u00e4iteks v\u00f5ivad hierogl\u00fc\u00fcfid olla j\u00e4rjestatud nende joonistuse j\u00e4rgi (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">hiina hierogl\u00fc\u00fcfide v\u00f5tmed<\/a><\/noindex>) v\u00f5i h\u00e4\u00e4lduse j\u00e4rgi. Kuidas peaksid emoji sorteerima, ei oska ma ausalt \u00f6elda, kuid ka nende jaoks saab midagi v\u00e4lja m\u00f5elda.<\/p>\n<p><\/p>\n<p>Tulenevalt eespool mainitud omadustest on v\u00e4lja t\u00f6\u00f6tatud peamised n\u00f5uded stringide v\u00f5rdlemiseks, mis p\u00f5hinevad Unicode tabelitel:<\/p>\n<p><\/p>\n<ul>\n<li>stringide v\u00f5rdlemine ei s\u00f5ltu s\u00fcmbolite asukohast kooditabelis;<\/li>\n<li>s\u00fcmbolite j\u00e4rjestused, mis moodustavad \u00fche s\u00fcmboli, viiakse kanonilisse vormi (<em>A<\/em> + \u00fclemine ring on sama, mis <em>\u00c5<\/em>);<\/li>\n<li>stringide v\u00f5rdlemisel k\u00e4sitletakse s\u00fcmbolit kontekstis ja vajadusel \u00fchendatakse see naabritega \u00fche v\u00f5rdlus\u00fcksusena (<em>Ch<\/em> tshehhi keeles) v\u00f5i jagatakse mitmeks (<em>\u00c6<\/em> prantsuse keeles);<\/li>\n<li>k\u00f5ik rahvuslikud omadused (alfabeet, suur\/kirjas, kirjavahem\u00e4rgid, kirjutamisviiside j\u00e4rjekord) peavad olema seadistatavad kuni k\u00e4sitsi m\u00e4\u00e4ramiseni (emod\u017eid);<\/li>\n<li>v\u00f5rdlemine on oluline mitte ainult sortimise jaoks, vaid ka paljude muude kohtade jaoks, n\u00e4iteks ridade vahemike m\u00e4\u00e4ramisel (asendus {A\u2026 \u044f} sisse <em>bash<\/em>);<\/li>\n<li>v\u00f5rdlemine peab toimuma piisavalt kiiresti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lisaks on raporti autorid formuleerinud v\u00f5rdlemise omadused, millele algoritmi arendajad ei peaks toetuma:<\/p>\n<p><\/p>\n<ul>\n<li>v\u00f5rdlemise algoritm ei tohi n\u00f5uda iga keele jaoks eraldi s\u00fcmbolite komplekti (vene ja ukraina keel kasutavad enamikku kirillitsast \u00fchiselt);<\/li>\n<li>v\u00f5rdlemine ei tohi toetuda s\u00fcmbolite j\u00e4rjekorrale Unicode tabelites;<\/li>\n<li>stringi kaal ei tohi olla stringi atribuut, kuna sama string erinevates kultuurilistes kontekstides v\u00f5ib omada erinevaid kaalu;<\/li>\n<li>stringide kaalud v\u00f5ivad muutuda liitmise v\u00f5i jagamise k\u00e4igus (v\u00e4lja <em>x<\/em> &lt; <em>y<\/em> ei t\u00e4henda, et <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>erinevad stringid, millel on samad kaalud, loetakse sortimisalgoritmi seisukohalt v\u00f5rdseks. Selliste stringide t\u00e4iendava j\u00e4rjekorda seadmise v\u00f5imalus on olemas, kuid see v\u00f5ib halvendada j\u00f5udlust;<\/li>\n<li>korrastatud sortimisel v\u00f5ivad samade kaaludega stringid omavahel vahetuda. Stabiilsus on konkreetse sortimisalgoritmi omadus, mitte stringide v\u00f5rdlemise algoritmi omadus (vt eelmist punkti);<\/li>\n<li>sortimisreeglid v\u00f5ivad aja jooksul muutuda, kui kultuurilised traditsioonid t\u00e4ienevad\/muudavad.<\/li>\n<\/ul>\n<p><\/p>\n<p>Samuti on m\u00e4rgitud, et v\u00f5rdlemise algoritm ei tea midagi v\u00f5rreldavate stringide semantikast. Seega ei tohi ainult numbritest koosnevaid stringe v\u00f5rrelda kui arvusid, ja ingliskeelsete nimetuste loendites ei tohi artikkel eemalduda (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>K\u00e4ideldes k\u00f5iki n\u00f5utud tingimusi, on ette n\u00e4htud mitmeastmeline (praktiliselt neljast astmest koosnev) tabelialgoritm.<\/p>\n<p><\/p>\n<p>Eelnevalt viidatakse, et stringi s\u00fcmbolid tuuakse kanoniliselt ja r\u00fchmitatakse v\u00f5rdlemise \u00fcksusteks. Iga v\u00f5rdlemise \u00fcksusele m\u00e4\u00e4ratakse mitu kaalu, mis vastavad mitmele v\u00f5rdlemise tasemele. V\u00f5rdlemise \u00fcksuste kaalud on j\u00e4rjestatud hulkade elemendid (antud juhul t\u00e4isarvud), mida saab v\u00f5rrelda suurem-v\u00e4hem. Eriline v\u00e4\u00e4rtus <em>IGNORED<\/em> (0x0) t\u00e4hendab, et vastava v\u00f5rdluse tasemel ei osale antud \u00fcksus v\u00f5rreldes. Stringide v\u00f5rdlemine v\u00f5ib korduda mitu korda, kasutades vastavate tasandite kaalu. Igal tasemel v\u00f5rreldakse j\u00e4rjestikku kahe stringi v\u00f5rdlemise kaalude \u00fcksusi.<\/p>\n<p><\/p>\n<p>Erinevates algoritmi rakendustes eri rahvuste traditsioonide jaoks v\u00f5ivad tegurite suurused erineda, kuid Unicode'i standardisse kuulub p\u00f5hikaalude tabel \u2014 <em>&quot;Default Unicode Collation Element Table&quot;<\/em> (<em>DUCET<\/em>). Tahan m\u00e4rkida, et muutuja seadmine <em>LC_COLLATE<\/em> on tegelikult viide kaalu tabeli valimisele stringide v\u00f5rdlemise funktsioonis.<\/p>\n<p><\/p>\n<p>Kaalu koefitsiendid <em>DUCET<\/em> on \u00fcles ehitatud j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>esimesel tasemel muudetakse k\u00f5ik t\u00e4hed \u00fchte suurust, diakriitilised m\u00e4rgid j\u00e4etakse v\u00e4lja, kirjavahem\u00e4rgid (mitte k\u00f5ik) ignoreeritakse;<\/li>\n<li>teisel tasemel arvestatakse ainult diakriitilisi m\u00e4rke;<\/li>\n<li>kolmandal tasemel arvestatakse ainult suurust;<\/li>\n<li>neljandal tasemel arvestatakse ainult kirjavahem\u00e4rke.<\/li>\n<\/ul>\n<p><\/p>\n<p>V\u00f5rdlemine toimub mitmete l\u00e4bik\u00e4ikude k\u00e4igus: esiteks v\u00f5rreldakse esimese taseme koefitsiente; kui kaalud on v\u00e4\u00e4rtustes v\u00f5rdsed, toimub uus v\u00f5rdlemine teise taseme kaaludega; seej\u00e4rel v\u00f5imalikult kolmanda ja neljanda tasemega.<\/p>\n<p><\/p>\n<p>V\u00f5rdlemine l\u00f5peb, kui stringides on vastavad \u00fcksteisele v\u00f5rreldavad \u00fcksused erinevate kaaludega. Stringid, mis omavad v\u00f5rdsed kaalu k\u00f5igil neljal tasemel, peetakse omavahel v\u00f5rdsed.<\/p>\n<p><\/p>\n<p>Just see algoritm (paljude t\u00e4iendavate tehniliste detailidega) andis nime aruandele nr 10 \u2014 <em>&quot;Unicode Collation Algorithm&quot;<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>Siin muutub sorteerimise k\u00e4itumine meie n\u00e4ites m\u00f5nev\u00f5rra selgemaks. Oleks hea seda v\u00f5rrelda Unicode'i standardiga.<\/p>\n<p><\/p>\n<p>Rakenduste testimiseks <em>UCA<\/em> on olemas spetsiaalne <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, mis kasutab <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">kaalude faili<\/a><\/noindex>, mis rakendab <em>DUCET<\/em>. Kaalude failis v\u00f5ib leida erinevaid huvitavaid asju. N\u00e4iteks on seal mahjongi ja Euroopa domino t\u00e4ringute j\u00e4rjestus ning kaardipakkides mastide j\u00e4rjestus (s\u00fcmbol <em>1F000<\/em> ja edasi). Kaardimastid on paigutatud vastavalt brid\u017ei reeglitele \u2014 PCHBT, ja kaardid mastis \u2014 j\u00e4rjestuses T, 2, 3\u2026 K.<\/p>\n<p><\/p>\n<p>Stringide sortimise \u00f5igsuse k\u00e4sitsi kontrollimine vastavalt <em>DUCET<\/em> oleks \u00fcsna t\u00fclikas, kuid \u00f5nneks on olemas esinduslik teostus teegist Unicode'i t\u00f6\u00f6tlemiseks \u2014 &quot;<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">Rahvusvahelised komponente Unicode'i jaoks<\/a><\/noindex>&quot; (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Selle raamatukogu veebisaidil, mis on v\u00e4lja t\u00f6\u00f6tatud <em>IBM<\/em>, on demonstreerimise lehek\u00fcljed, sealhulgas <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">stringide v\u00f5rdlemise algoritmi leht<\/a><\/noindex>. Sisestame meie teststringid vaike seadistustega ja, oh imet, saame ideaalse eesti sorteeringu.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Mihhail;maalija\nJolkina Ella;kraanaoperaator\nIvanov Andrei;torumees\nIvanova Alla;advokaad<\/code><\/pre>\n<p><\/p>\n<p>Muide, veebisaidilt <em>ICU<\/em> leiate t\u00e4psustusi v\u00f5rdlemise algoritmi toimimise kohta, kui k\u00e4sitletakse kirjavahem\u00e4rke. N\u00e4idetes <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">Collation FAQ<\/a><\/noindex> ignoreeritakse apostroofe ja sidekriipse.<\/p>\n<p><\/p>\n<p>Unicode aitas meid, kuid peame leidma imelike k\u00e4itumise p\u00f5hjused <em>sort<\/em> ja <em>Linux<\/em> kusagil mujal.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Sorteerimine glibc-s<\/h1>\n<p><\/p>\n<p>Kiire \u00fclevaade GNU Core Utilsi <em>sort<\/em> API-s <em>allikakoodist n\u00e4itas, et utiliidi lokaliseerimine piirdub muutujate praeguse v\u00e4\u00e4rtuse v\u00e4ljatr\u00fckiga<\/em> k\u00e4ivitamise ajal t\u00f5rkeotsingure\u017eiimis: <em>LC_COLLATE<\/em> $ sort --debug buhg.txt &gt; buhg.srt\nsort: kasutab \u2018en_US.UTF8\u2019 sorteeri reegleid<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Stringide v\u00f5rdlemine toimub standardse funktsiooni<\/code><\/pre>\n<p><\/p>\n<p>strcoll <em>, seega on k\u00f5ik huvitav osa raamatukogust<\/em>stringide v\u00f5rdlemisele p\u00fchendatud <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>Pealehe <em>wiki<\/em> projekti <em>glibc<\/em> \u00fcks l\u00f5ik <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">. Sellest l\u00f5igust on v\u00f5imalik aru saada, et<\/a><\/noindex>sorteerimine p\u00f5hineb juba meile tuntud algoritmil <em>glibc<\/em> The Unicode collation algorithm <em>UCA<\/em> (<em>) ja\/v\u00f5i sellele sarnasel standardil<\/em>ISO 14651 <em>Rahvusvaheline stringide j\u00e4rjestamise ja v\u00f5rdlemise<\/em> (<em>). Seoses viimase standardiga tuleb m\u00e4rkida, et veebisaidil<\/em>standards.iso.org <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">on ametlikult kuulutatud avalikuks, kuid vastav link viib mitteeksisteerivale lehele. Google annab mitmeid lehti viidete kohta ametlikele saitidele, mis pakuvad ostmiseks elektroonilist koopiat standardist sajandi euro eest, kuid otsingu kolmandal-neljandal lehel leiate ka otse lingid<\/a><\/noindex> <em>Rahvusvaheline stringide j\u00e4rjestamise ja v\u00f5rdlemise<\/em> . \u00dcldiselt ei erine standard praktiliselt <em>PDF<\/em>, kuid on igavamat lugeda, kuna ei sisalda eredate n\u00e4idete riiklikke omadusi stringide sorteerimisel. <em>UCA<\/em>Sellel veebisaidil leidis k\u00f5ige huvitavam teave <\/p>\n<p><\/p>\n<p>oli link <em>wiki<\/em> veak\u00fcllastusse <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">stringide v\u00f5rdlemise rakenduse arutelu<\/a><\/noindex> . Arutelust v\u00f5ib teada saada, et <em>glibc<\/em>stringide v\u00f5rdlemiseks kasutatakse <em>glibc<\/em> Common Template Table'i <em>ISO<\/em>CTT <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">), mille aadressi leiate standardi<\/a><\/noindex> (<em>lisast<\/em>. Aastatel 2000 ja 2015 oli see tabel <em>A<\/em> tavaliselt stabiilne. <em>Rahvusvaheline stringide j\u00e4rjestamise ja v\u00f5rdlemise<\/em>. Aastatel 2000 kuni 2015 ilmus see tabel <em>glibc<\/em> ei omanud hooldajat ja erines \u00fcsna tugevalt (v\u00e4hemalt v\u00e4limuselt) praegusest standardi versioonist. Aastatel 2015 kuni 2018 toimus kohandamine uue tabeliversiooniga ja hetkel on teil v\u00f5imalus reaalses elus kohtuda nii uue tabeliversiooniga (<em>CentOS 8<\/em>), kui ka vana (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd, kui kogu teave algoritmi ja abite tabelite kohta on olemas, saame naasta algse probleemi juurde ja m\u00f5ista, kuidas \u00f5igesti sorteerida read Vene lokaliseerimise kontekstis.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Meid huvitava tabeli l\u00e4htekood <em>lisast<\/em> enamikes jaotustes <em>Linux<\/em> asub kataloogis <em>\/usr\/share\/i18n\/locales\/<\/em>. Ise tabel asub failis <em>iso14651_t1_common<\/em>. Siis see fail direktiiviga <em>copy iso14651_t1_common<\/em> sisaldub failis <em>iso14651_t1<\/em>, mis omakorda sisaldub riiklikes failides, sealhulgas <em>en_US<\/em> ja <em>ru_RU<\/em>. Enamikes jaotustes <em>Linux<\/em> on k\u00f5ik l\u00e4htefailid osa p\u00f5hinstallatsioonist, kuid kui neid ei ole, tuleb installida t\u00e4iendav paket jaotusest.<\/p>\n<p><\/p>\n<p>Faili struktuur <em>iso14651_t1<\/em> v\u00f5ib tunduda kohutavalt s\u00f5naline, mitte selgete reeglitega nimede koostamisel, kuid kui s\u00fcveneda, on k\u00f5ik piisavalt lihtne. Struktuur on kirjeldatud standardis <em>ISO 14652<\/em>, mille koopia on saadaval laadimiseks veebilehelt <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. Veel \u00fche faili formaadi kirjeldamise leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">spetsifikatsioonidest<\/a><\/noindex> <em>POSIX-i<\/em> alates <em>OpenGroup<\/em>. Alternatiivina standardi lugemisele v\u00f5ite uurida funktsiooni l\u00e4htekode <em>collate_read<\/em> ja <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Faili struktuur on j\u00e4rgmine:<\/p>\n<p><\/p>\n<p>Vaikimisi kasutatakse s\u00fcmbolit  kui ekraanits\u00fcmbolit ja rea l\u00f5pp p\u00e4rast s\u00fcmbolit # on kommentaar. M\u00f5lemat s\u00fcmbolit saab \u00fcmber m\u00e4\u00e4rata, mis ka toimus uue tabeliversiooniga:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>Failis v\u00f5ib esineda tokenid formaadis <em>&lt;Uxxxx&gt;<\/em> v\u00f5i <em>&lt;Uxxxxxxxx&gt;<\/em> kui <em>x<\/em> \u2014 kuusnurkne number). See on Unicode koodpunktide kuusnurkne esituskodeeringus <em>UCS-4<\/em> (<em>UTF-32<\/em>). K\u00f5ik muud elemendid nurksulgudes (sealhulgas <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> ja sarnased), peetakse lihtsateks stringi konstantideks, millel ei ole eriliselt t\u00e4hendust konteksti v\u00e4ljaspool.<\/p>\n<p><\/p>\n<p>Rida <em>LC_COLLATE<\/em> \u00fctleb meile, et j\u00e4rgmised andmed kirjeldavad stringide v\u00f5rdlemist.<\/p>\n<p><\/p>\n<p>Esialgu m\u00e4\u00e4ratakse kaaludele nimed v\u00f5rdlustabelis ja s\u00fcmbolite kombinatsioonidele. \u00dcldiselt kuuluvad kaks t\u00fc\u00fcpi nimesid kahte erinevasse \u00fcksusesse, kuid reaalses failis on need segamini. Kaalude nimed m\u00e4\u00e4ratakse v\u00f5tmes\u00f5naga <em>collating-symbol<\/em> (v\u00f5rdluss\u00fcmbol), kuna Unicode'i s\u00fcmbolid, millel on samad kaalud, arvestatakse ekvivalentseteks s\u00fcmboliteks.<\/p>\n<p><\/p>\n<p>Praeguse faili versiooni sektsiooni kogupikkus on umbes 900 rida. Olen n\u00e4iteks v\u00e4lja l\u00f5iganud mitmest kohast, et n\u00e4idata nimede juhuslikkust ja eri t\u00fc\u00fcpi s\u00fcntaksit.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n\ncollating-symbol &lt;RES-1&gt;\ncollating-symbol &lt;BLK&gt;\ncollating-symbol &lt;MIN&gt;\ncollating-symbol &lt;WIDE&gt;\n...\ncollating-symbol &lt;ARABIC&gt;\ncollating-symbol &lt;ETHPC&gt;\ncollating-symbol &lt;OSMANYA&gt;\n...\ncollating-symbol &lt;S1D000&gt;..&lt;S1D35F&gt;\ncollating-symbol &lt;SFFFF&gt; % garanteeritud suurim s\u00fcmboliv\u00e4\u00e4rtus. Hoia l\u00f5puks sellest loendist\n...\ncollating-element &lt;U0413_0301&gt; from &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;\ncollating-element &lt;U0413_0341&gt; from &quot;&lt;U0413&gt;&lt;U0341&gt;&quot;<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>collating-symbol<\/em> registreerib rea <em>OSMANYA<\/em> kaalude nimede tabelis <\/li>\n<li><em>collating-symbol ..<\/em> registreerib nimede jada, mis koosneb eesliitest <em>S<\/em> ja heksadetsimaalsest numbrilisest sufiksist, mis on <em>1D000<\/em> kuni <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> ja <em>collating-symbol<\/em> n\u00e4ib olevat suur positiivne t\u00e4isarv heksadetsimaalses s\u00fcsteemis, kuid <em>&lt;SFFFF&gt;<\/em> on lihtsalt nimi, mis v\u00f5iks v\u00e4lja n\u00e4ha nagu <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>nimi <em>&lt;U0413&gt;<\/em> t\u00e4hendab koodipunkti kodeeringus <em>UCS-4<\/em><\/li>\n<li><em>collating-element &lt;U0413_0301&gt; from &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;<\/em> registreerib uue nime kahele Unicode'i punktile. <\/li>\n<\/ul>\n<p><\/p>\n<p>Kui kaalude nimed on m\u00e4\u00e4ratletud, m\u00e4\u00e4ratakse nende tegelikud kaalud. Kuna v\u00f5rdlemisel loevad ainult suuremad-v\u00e4iksemad suhted, m\u00e4\u00e4ratakse kaalud lihtsa nimede j\u00e4rjestamisega. Esiteks loetletakse kergemad kaalu, seej\u00e4rel raskemad. Mulle meeldib meenutada, et iga Unicode'i s\u00fcmbolile antakse neli erinevat kaalu. Siin on need koondatud \u00fchte j\u00e4rjepidevasse j\u00e4rjestusse. Teoreetiliselt v\u00f5ib iga s\u00fcmboolne nimi olla mingil neljast tasemest, kuid kommentaarid viitavad sellele, et arendajad jaotavad nimed vaimselt tasemete vahel.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% S\u00fcmboolsete kaalude m\u00e4\u00e4ramised\n\n% Kolmanda taseme kaalude m\u00e4\u00e4ramised\n\n\n\n\n...\n% Teise taseme kaalude m\u00e4\u00e4ramised\n\n % KOMBINERIV ALAJ\u00d5M\n % KOMBINERIV KOMMA \u00dcLE\n % KOMBINERIV P\u00d6\u00d6RDUMINE KUMMA \u00dcLE\n...\n% Esimese taseme kaalude m\u00e4\u00e4ramised\n % HORIZONTAALNE TABULATSIOON\n % REAASTIMINE\n % VERTIKAALNE TABULATSIOON\n...\n % K\u00dcRILI KEELE V\u00c4IKE KIRI DE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI KOMI DE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI DJE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI KOMI DJE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI GJE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI ZE, MILLEL ON ALLA MINEK\n % K\u00dcRILI KEELE V\u00c4IKE KIRI IE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI IE, MILLEL ON BREVI\n % K\u00dcRILI KEELE V\u00c4IKE KIRI UKRAINIAN IE\n % K\u00dcRILI KEELE V\u00c4IKE KIRI ZHE<\/code><\/pre>\n<p><\/p>\n<p>L\u00f5puks, tabel koos kaaludega.<\/p>\n<p><\/p>\n<p>Kaalude sektsioon on joontega, mis sisaldavad v\u00f5tmes\u00f5nu <em>order_start<\/em> ja <em>order_end<\/em>. T\u00e4iendavad parameetrid <em>order_start<\/em> m\u00e4\u00e4ravad, millises suunas read igal v\u00f5rdlemise tasemel vaadatakse. Vaikimisi kasutatakse parameetrit <em>forward<\/em>. Sektsiooni keha koosneb ridadest, mis sisaldavad s\u00fcmboli koodi ja nelja selle kaalu. S\u00fcmboli kood v\u00f5ib olla esindatud kas s\u00fcmbol ise, koodipunkt v\u00f5i s\u00fcmboolne nimi, mis on varem m\u00e4\u00e4ratletud. Kaalu saab samuti m\u00e4\u00e4rata s\u00fcmboolsete nimede, koodipunktide v\u00f5i s\u00fcmbolite kaudu. Kui kasutatakse koodipunkte v\u00f5i s\u00fcmboleid, siis nende kaal on samasugune kui koodipunkti numbriline v\u00e4\u00e4rtus (positsioon Unicode tabelis). S\u00fcmbolid, mida ei ole selgelt m\u00e4\u00e4ratletud (nii nagu ma aru saan), arvestatakse tabelisse peamise kaaluga, mis vastab positsioonile Unicode tabelis. Eriline kaalu v\u00e4\u00e4rtus <em>IGNORE<\/em> t\u00e4hendab, et vastaval v\u00f5rdlemise tasemel seda s\u00fcmbolit ei arvestata.<\/p>\n<p><\/p>\n<p>Kaalude struktuuri demonstreerimiseks valisin kolm piisavalt ilmselget fragmenti:<\/p>\n<p><\/p>\n<ul>\n<li>s\u00fcmbolid, mida t\u00e4ielikult ignoreeritakse<\/li>\n<li>s\u00fcmbolid, mis on ekvivalentne numbrile kolm esimesel kahel tasemel<\/li>\n<li>kiri kyrillises alfabeedis, mis ei sisalda diakriitilisi m\u00e4rke ja seet\u00f5ttu sorteeritakse peamiselt esimesel ja kolmandal tasemel.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">order_start forward;forward;forward;forward,position\n IGNORE;IGNORE;IGNORE;IGNORE % NULL (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF HEADING (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF TEXT (in 6429)\n...\n ;;; % DIGIT THREE\n ;;; % FULLWIDTH DIGIT THREE\n ;;; % PARENTHESIZED DIGIT THREE\n ;;; % DIGIT THREE FULL STOP\n ;;<FONT>; % MATHEMATICAL BOLD DIGIT THREE\n...\n ;;; % CYRILLIC SMALL LETTER A\n ;;; % CYRILLIC CAPITAL LETTER A\n ;;; % CYRILLIC SMALL LETTER A WITH BREVE\n ;;; % CYRILLIC SMALL LETTER A WITH BREVE\n...\n ;;; % CYRILLIC SMALL LETTER BE\n ;;; % CYRILLIC CAPITAL LETTER BE\n ;;; % CYRILLIC SMALL LETTER VE\n ;;; % CYRILLIC CAPITAL LETTER VE\n...\norder_end<\/code><\/pre>\n<p><\/p>\n<p>N\u00fc\u00fcd saab j\u00e4lle naasta artikli alguse n\u00e4idete sortimise juurde. Probleem peitub tabeli kaalu selles osas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">IGNORE;IGNORE;IGNORE; % SPACE\n IGNORE;IGNORE;IGNORE; % EXCLAMATION MARK\n IGNORE;IGNORE;IGNORE; % QUOTATION MARK\n...<\/code><\/pre>\n<p><\/p>\n<p>On n\u00e4ha, et selles tabelis on kirjavahem\u00e4rgid tabelist <em>Pobitine v\u00f5i pobaita rasteriseerimine<\/em> (sealhulgas t\u00fchik) stringide v\u00f5rdlemisel praktiliselt alati ignoreeritakse. Eranditeks on vaid read, mis kattuvad t\u00e4ielikult, v\u00e4lja arvatud kirjavahem\u00e4rgid, mis esinevad kattuvates positsioonides. Minu n\u00e4ite read (p\u00e4rast sortimist) n\u00e4evad v\u00e4lja j\u00e4rgmised:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMihhailv\u00e4rvija\nJolkinaElakraanioperaator\nIvanovaAllav\u00e4rvija\nIvanovAndrei puusepp<\/code><\/pre>\n<p><\/p>\n<p>Arvestades, et kaalu tabelis k\u00e4ivad vene keeles suurt\u00e4hed p\u00e4rast v\u00e4iket\u00e4hti (kolmandal tasemel <em>&lt;CAP&gt;<\/em> raske kui <em>&lt;MIN&gt;<\/em>), sortimine n\u00e4ib t\u00e4iesti korrektne.<\/p>\n<p><\/p>\n<p>Muutes muutuja <em>LC_COLLATE=C<\/em> laaditakse eriline tabel, mis m\u00e4\u00e4rab baitide v\u00f5rdlemise<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">static const uint32_t collseqwc[] =\n{\n  8, 1, 8, 0x0, 0xff,\n  \/* 1st-level table *\/\n  6 * sizeof (uint32_t),\n  \/* 2nd-level table *\/\n  7 * sizeof (uint32_t),\n  \/* 3rd-level table *\/\n  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',\n  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',\n\n...\n  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'fe', L'xff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Kuna Unicode'is on t\u00e4hem\u00e4rk \u0401 enne A, sorteeritakse read vastavalt.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Tekstilised ja binaarsed tabelid<\/h1>\n<p><\/p>\n<p>On ilmne, et stringide v\u00f5rreldamine on \u00e4\u00e4rmiselt sagedane operatsioon ja tabeli anal\u00fc\u00fcs <em>lisast<\/em> m\u00f5nev\u00f5rra kulukas protseduur. Tabeli juurdep\u00e4\u00e4su optimeerimiseks kompileeritakse see binaarfaili kujule k\u00e4su <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Meeskond <em>localedef<\/em> mis v\u00f5tab parameetritena faili riiklike erip\u00e4rade tabeliga (valik <em>-i<\/em>), milles k\u00f5ik s\u00fcmbolid on esitatud Unicode'i punktidena, ja faili, mis seondab Unicode'i punktid konkreetses kodeeringus s\u00fcmbolitega (valik <em>-f<\/em>). T\u00f6\u00f6 tulemusena luuakse binaarfailid lokaali jaoks, mille nimi on m\u00e4\u00e4ratud viimases parameetris.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> toetab kahte binaarfaili formaati: &quot;traditsiooniline&quot; ja &quot;kaasaegne&quot;.<\/p>\n<p><\/p>\n<p>Traditsiooniline formaat t\u00e4hendab, et lokaali nimi on nimekiri alla kaustas <em>\/usr\/lib\/locale\/<\/em>. Sellel alamkaustal hoitakse binaarfailide <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> jne. Fail <em>LC_IDENTIFICATION<\/em> sisaldab lokaali formaalset nime (mis v\u00f5ib erineda kausta nimest) ja kommentaare.<\/p>\n<p><\/p>\n<p>Kaasaegne formaat eeldab, et k\u00f5ik lokaalid hoitakse \u00fches arhiivis <em>\/usr\/lib\/locale\/locale-archive<\/em>, mis kaardistatakse virtuaalsesse m\u00e4llu k\u00f5igile protsessidele, mis seda kasutavad <em>glibc<\/em>. Kaasaegses formaadis nimetatakse lokaali nime teatud kanoniseerimisele \u2014 kodeeringu nimedes j\u00e4\u00e4vad ainult numbrid ja t\u00e4hed, mis on muudetud v\u00e4ikesteks t\u00e4htedeks. Nii <em>ru_RU.KOI8-R<\/em>, salvestatakse kui <em>ru_RU.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Sisendfailid otsitakse jooksva kausta ning kaustade <em>\/usr\/share\/i18n\/locales\/<\/em> ja <em>\/usr\/share\/i18n\/charmaps\/<\/em> failide <em>lisast<\/em> ja kodeeringute failide vastavalt.<\/p>\n<p><\/p>\n<p>N\u00e4iteks k\u00e4sk<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">localedef -i ru_RU -f MAC-CYRILLIC ru_RU.MAC-CYRILLIC<\/code><\/pre>\n<p><\/p>\n<p>kompileerib faili <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> kasutades kodeerimisfaili <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> ja salvestab tulemuse <em>\/usr\/lib\/locale\/locale-archive<\/em> koos nimega <em>ru_RU.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Kui keskkonnamuutuja <em>LANG=en_US.UTF-8<\/em> siis <em>glibc<\/em> otsib lokaali binaarfailide j\u00e4rgmist j\u00e4rgnevate failide ja kaustade j\u00e4rjekorras:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/usr\/lib\/locale\/locale-archive\n\/usr\/lib\/locale\/en_US.UTF-8\/\n\/usr\/lib\/locale\/en_US\/\n\/usr\/lib\/locale\/enUTF-8\/\n\/usr\/lib\/locale\/en\/<\/code><\/pre>\n<p><\/p>\n<p>Kui lokaal esineb nii traditsioonilistes kui ka kaasaegsetes formaatides, antakse eelnev kaal kaasaegsele.<\/p>\n<p><\/p>\n<p>Koostatud lokaalide nimekirja saab vaadata k\u00e4suga <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">Oma v\u00f5rdlustabeli ettevalmistamine<\/h1>\n<p><\/p>\n<p>N\u00fc\u00fcd, varustatud teadlike teadmistega, saab luua oma ideaalse stringide v\u00f5rdlustabeli. See tabel peab \u00f5igesti v\u00f5rreldama vene t\u00e4hti, sealhulgas t\u00e4hti \u0401, arvestades samas ka kirjavahem\u00e4rke vastavalt tabelile <em>Pobitine v\u00f5i pobaita rasteriseerimine<\/em>.<\/p>\n<p><\/p>\n<p>Oma sortimisse tabeli ettevalmistamise protsess koosneb kahest etapist: kaalutabeli redigeerimisest ja selle binaarfailiks kompileerimisest k\u00e4suga <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Kuna v\u00f5rreldava tabeli kohandamine minimaalse redigeerimise kuludega on v\u00f5imalik, on formaadis <em>ISO 14652<\/em> on olemas olemasoleva tabeli kaalu kohandamise sektsioonid. Sektsioon algab v\u00f5tmes\u00f5nast <em>reorder-after<\/em> ja positsiooni n\u00e4itamisest, mille j\u00e4rel asendamine toimub. Sektsiooni l\u00f5petab rida <em>reorder-end<\/em>. Kui tabeli mitmeid osi tuleb kohandada, luuakse iga sellise osa jaoks oma sektsioon.<\/p>\n<p><\/p>\n<p>Ma kopeerisin uued faili versioonid <em>iso14651_t1_common<\/em> ja <em>ru_RU<\/em> repositooriumist <em>glibc<\/em> oma kodukatalooge ~\/.local\/share\/i18n\/locales\/ ja redigeerisin osakonda natuke. <em>LC_COLLATE<\/em> ja <em>ru_RU<\/em>. Uued faili versioonid on t\u00e4ielikult \u00fchilduvad minu versiooniga <em>glibc<\/em>. Kui soovite kasutada vanemaid faili versioone, peate muutma s\u00fcmboolseid nimesid ja asukohta, kust asendamine algab tabelis.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Kopeeri mall ISO\/IEC 14651\nkopi &quot;iso14651_t1&quot;\nreorder-after &lt;U000D&gt;\n&lt;U0020&gt; &lt;S0020&gt;;&lt;BASE&gt;;&lt;MIN&gt;&lt;U0020&gt; % RUUM\n&lt;U0021&gt; &lt;S0021&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0021&gt; % H\u00dc\u00dcDMISE M\u00c4RK\n&lt;U0022&gt; &lt;S0022&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0022&gt; % TSITAATIM\u00c4RK\n...\n&lt;U007D&gt; &lt;S007D&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007D&gt; % PAREM K\u00c4\u00c4RILINE KOHV\n&lt;U007E&gt; &lt;S007E&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007E&gt; % TILDA\nreorder-end\nL\u00d5PP LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>Tegelikult oleks pidanud v\u00e4ljad muutma <em>LC_IDENTIFICATION<\/em> nii, et need viitavad lokaali <em>ru_MY<\/em>, kuid minu n\u00e4ites ei olnud seda vaja, kuna ma j\u00e4tsin v\u00e4lja lokaalisalad <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Et <em>localedef<\/em> t\u00f6\u00f6tas failidega minu kaustas l\u00e4bi muutuja <em>I18NPATH<\/em> v\u00f5ib lisada lisakausta sisendfailide otsimiseks, ja binaarfailide salvestamise katalooge saab m\u00e4\u00e4rata tee kaudu, mis on sl\u00e4shidega:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\/.local\/share\/i18n localedef -i ru_RU -f UTF-8 ~\/.local\/lib\/locale\/ru_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX-i<\/em> eeldab, et <em>LANG<\/em> v\u00f5ib kirjutada absoluutteed failide kataloogide jaoks, mis algavad sirgest sl\u00e4shist, kuid <em>glibc<\/em> ja <em>Linux<\/em> k\u00f5ik teed loetakse aluskataloogist, mille saab \u00fcle m\u00e4\u00e4rata muutuja <em>LOCPATH<\/em>. P\u00e4rast seadistamist <em>LOCPATH=~\/.local\/lib\/locale\/<\/em> k\u00f5ik lokaliseerimisega seotud failid otsitakse ainult minu kaustast. Lokaali arhiiv seadistatud muutuja korral <em>LOCPATH<\/em> ignored.<\/p>\n<p><\/p>\n<p>Siin on otsustav test:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_MY.UTF-8 LOCPATH=~\/.local\/lib\/locale\/ sort buhg.txt\nAbakanov Mihhail;maalija\nJolkina Ella;kraanajuht\nIvanov Andre;torulukksepp\nIvanova Alla;advokaat<\/code><\/pre>\n<p><\/p>\n<p>Hurraa! Me tegime selle \u00e4ra!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">T\u00f6\u00f6tamine vigade kallal<\/h1>\n<p><\/p>\n<p>Olen juba vastanud alguses esitatud ridade sortimise k\u00fcsimustele, kuid on veel paar k\u00fcsimust vigade kohta - n\u00e4htavad ja n\u00e4htamatud.<\/p>\n<p><\/p>\n<p>Naaseme algse \u00fclesande juurde.<\/p>\n<p><\/p>\n<p>Ja programm <em>sort<\/em> ja programm <em>join<\/em> kasutavad samu stringide v\u00f5rdlemise funktsioone <em>glibc<\/em>. Kuidas see juhtus, et <em>join<\/em> n\u00e4itas sorteerimise viga ridade puhul, mis olid sorteeritud k\u00e4suga <em>sort<\/em> kohalikus <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> v\u00f5rdleb rida t\u00e4ielikult, kuid <em>join<\/em> v\u00f5rdleb ainult m\u00e4rks\u00f5na, milleks on vaikimisi rida kuni esimese t\u00fchiku s\u00fcmbolini. Minu n\u00e4ites p\u00f5hjustas see veateate, kuna ridade esimeste s\u00f5nade sorteerimine ei klappinud t\u00e4isridade sorteerimisega.<\/p>\n<p><\/p>\n<p>Kohalik <em>&quot;C&quot;<\/em> tagab, et sorteeritud ridades on algsed alampead s\u00f5nad kuni esimese t\u00fchiku s\u00fcmbolini samuti sorteeritud, kuid see varjab vaid viga. V\u00f5ib leida selliseid andmeid (inimesed, kellel on samad perekonnanimed, kuid erinevad eesnimed), mis annavad vale faili \u00fchendamise tulemuse ilma veateateta. Kui soovime, et <em>join<\/em> \u00fchendaks failide ridu perekonna- ja eesnime j\u00e4rgi, siis \u00f5ige viis oleks eraldaja m\u00e4\u00e4ramine ja nende sorteerimine m\u00e4rks\u00f5na j\u00e4rgi, mitte kogu rea j\u00e4rgi. Sel juhul toimub ka \u00fchendamine \u00f5igesti ja mingis kohalikus ei esine vigu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort -t ; -k 1 buhg.txt &gt; buhg.srt\n$&gt; sort -t ; -k 1 mail.txt &gt; mail.srt\n$&gt; join -t ; buhg.srt mail.srt &gt; result<\/code><\/pre>\n<p><\/p>\n<p>Edukalt l\u00f5petatud n\u00e4ide kodeeringus <em>CP1251<\/em> k\u00e4tkeb veel \u00fcht viga. Nimelt on k\u00f5igis minu teadaolevates distributsioonides <em>Linux<\/em> pakettides puuduv kompileeritud kohalik <em>ru_RU.CP1251<\/em>. Kui kompileeritud kohalikku ei leita, siis <em>sort<\/em> kasutatakse vaikselt byte-tasemel v\u00f5rdlemist, mida me olime ka n\u00e4inud.<\/p>\n<p><\/p>\n<p>Muide, on ka veel \u00fcks v\u00e4ike t\u00f5rge, mis on seotud kompileeritud lokalite puudumisega. K\u00e4sk <em>LOCPATH=\/tmp locale -a<\/em> annab v\u00e4lja k\u00f5igi lokalite loendi <em>locale-archive<\/em>, kuid seatud muutuja <em>LOCPATH<\/em> k\u00f5ikide programmide (sealhulgas <em>locale<\/em>) jaoks ei ole need kohalikud saadaval.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LOCPATH=\/tmp locale -a | grep en_US\nlocale: Cannot set LC_CTYPE to default locale: No such file or directory\nlocale: Cannot set LC_MESSAGES to default locale: No such file or directory\nlocale: Cannot set LC_COLLATE to default locale: No such file or directory\nen_US\nen_US.iso88591\nen_US.iso885915\nen_US.utf8\n\n$&gt; LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using \u2018en_US.UTF-8\u2019 sorting rules\n\n$&gt; LOCPATH=\/tmp LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using simple byte comparison<\/code><\/pre>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<p>Kui oled programmeerija, kes harjunud arvama, et read on byte'ide kogum, siis on sinu valik <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>Kui oled lingvist v\u00f5i s\u00f5naraamatute koostaja, siis on sul parem oma kohalik kompileerida.<\/p>\n<p><\/p>\n<p>Kui oled tavaline kasutaja, siis piisab, kui harjuda sellega, et k\u00e4sk <em>ls -a<\/em> annab v\u00e4lja faile, mis algavad punktiga, koos failidega, mis algavad t\u00e4hega, ja <em>Midnight Commander<\/em>, mis kasutab oma sisemisi funktsioone nimede sortimiseks, viib failid, mille nimi algab punktiga, loendi ette.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Viidatud lingid<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Aruanne nr 10 Unicode sortimisalgoritmi kohta <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">S\u00fcmbolite kaalud unicode.org-is <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/intro\"><em>ICU<\/em> \u2014 teostus IBM-i Unicode'i t\u00f6\u00f6tlemise raamatukogust. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Sorteerimistest <em>ICU<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">S\u00fcmbolite kaalud <em>Rahvusvaheline stringide j\u00e4rjestamise ja v\u00f5rdlemise<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">Faili formaadi kirjeldus kaaludega <em>ISO 14652<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">Kettide v\u00f5rdlemise arutelu <em>glibc<\/em><\/a><\/noindex><\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/503960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0431\u0430\u0437\u044b \u043e\u0442\u0434\u0435\u043b\u0430 \u043a\u0430\u0434\u0440\u043e\u0432. \u041e\u0431\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u042e\u043d\u0438\u043a\u043e\u0434 UTF-8 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0441 \u044e\u043d\u0438\u043a\u0441\u043e\u0432\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0446\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 mail.txt \u0418\u0432\u0430\u043d\u043e\u0432 \u0410\u043d\u0434\u0440\u0435\u0439;ia@example.com \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 buhg.txt \u0418\u0432\u0430\u043d\u043e\u0432\u0430 \u0410\u043b\u043b\u0430;\u043c\u0430\u043b\u044f\u0440 \u0401\u043b\u043a\u0438\u043d\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-83055","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Linux\u2019\u043e\u0432\u0441\u043a\u0438\u0439 sort \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-27T23:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-27T23:42:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas Linuxi sort sorteerib ridu | ProHoster","description":"Sissejuhatus K\u00f5ik algas l\u00fchikesest skriptist, mis pidi \u00fchendama t\u00f6\u00f6tajate e-posti aadresside teabe, mis saadi postitusloendi kasutajatelt.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Linux\u2019\u043e\u0432\u0441\u043a\u0438\u0439 sort \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-27T23:42:15+00:00","article:modified_time":"2020-05-27T23:42:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"83055","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:26:22","updated":"2022-09-27 19:16:08","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}