{"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 Linux'i sort sorteerib stringe","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 teabe t\u00f6\u00f6tajate e-posti aadresside kohta, <em>e-mail<\/em> mis saadud e-posti loendi kasutajate nimekirjast, koos t\u00f6\u00f6tajate ametikohtadega, mis saadi personaliosakonna andmebaasist. M\u00f5lemad nimekirjad eksporditi tekstifailidesse Unicode kodeeringuga, <em>UTF-8<\/em> ja salvestati Unix'i ridade l\u00f5ppudega.<\/p>\n<p><\/p>\n<p>Sisu <em>mail.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov Andrei;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\nJolkina Ella;kraanajuhiks\nIvanov Andrei;torumees\nAbakanov Mihhail;maaler<\/code><\/pre>\n<p><\/p>\n<p>Failide \u00fchendamiseks sorteeriti need Unix'i k\u00e4suga <em>sort<\/em> ja edastati Unix'i programmile, <em>liitu<\/em>, mis l\u00f5petas ootamatult vea 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 Andrei;torumees<\/code><\/pre>\n<p><\/p>\n<p>Sorteerimise tulemuse visuaalne kontroll n\u00e4itas, et \u00fcldiselt on sorteerimine \u00f5ige, kuid meessoost ja naissoost perekonnanimede kattumiste korral on naised enne mehi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Mihhail;maaler\nJolkina Ella;kraanajuhiks\nIvanova Alla;maaler\nIvanov Andrei;torumees<\/code><\/pre>\n<p><\/p>\n<p>Tundub nagu Unicode sorteerimise viga v\u00f5i nagu feminism sorteerimisalgoritmis. Esimene, muidugi, on usutavam.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>J\u00e4tame praegu k\u00f5rvale <em>liitu<\/em> ja keskendume <em>sort<\/em>. Proovime \u00fclesannet lahendada katsetamise meetodil. Alguseks muutkem kohaleks <em>en_US<\/em> j\u00e4rgnevaga <em>et_RU<\/em>. Sorteerimiseks piisaks keskkonnamuutuja seadmisest <em>LC_COLLATE<\/em>, aga me ei j\u00e4\u00e4 selliste v\u00e4ikeste asjadega vaeva:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=et_RU.UTF-8 sort buhg.txt\nAbakanov Mihhail;v\u00e4rvija\nJolkina Ella;kraanajuhataja\nIvanova Alla;v\u00e4rvija\nIvanov Andrei;torumees<\/code><\/pre>\n<p><\/p>\n<p>Midagi ei ole muutunud.<\/p>\n<p><\/p>\n<p>Proovime faile \u00fchebaidise kodeeringuga \u00fcmber kodeerida: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t KOI8-R buhg.txt \n | LANG=et_RU.KOI8-R sort \n | iconv -f KOI8-R -t UTF8<\/code><\/pre>\n<p><\/p>\n<p>Taaskord ei ole midagi muutunud.<\/p>\n<p><\/p>\n<p>Midagi ei ole teha, tuleb leida lahendus internetist. Otseses m\u00f5ttes venekeelsete perekonnanimede kohta pole midagi, aga on k\u00fcsimusi teiste sorteerimise eriskummaliste asjade kohta. 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) m\u00e4rke n\u00e4htamatuna<\/a><\/noindex>. L\u00fchidalt \u00f6eldes sorteeritakse stringid &quot;a-b&quot;, &quot;aa&quot;, &quot;ac&quot; nagu &quot;aa&quot;, &quot;a-b&quot;, &quot;ac&quot;.<\/p>\n<p><\/p>\n<p>Vastus on igal pool standardne: kasutage programmeerija kohalikke seadeid <em>&quot;C&quot;<\/em> ja siis on teil \u00f5nn. Proovime:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJolkina Ella;kraanajuhataja\nAbakanov Mihhail;v\u00e4rvija\nIvanov Andrei;torumees\nIvanova Alla;advokaat<\/code><\/pre>\n<p><\/p>\n<p>Midagi on muutunud. Ivanov\u2019id on \u00f5iges j\u00e4rjekorras, kuid Jolkina on kuhugi kadunud. Naaseme algsele \u00fclesandele:<\/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 on vaatamata \u0401lkini esimesele reale.<\/p>\n<p><\/p>\n<p>Probleem n\u00e4ib olevat lahendatud, kuid igaks juhuks proovime veel \u00fcht 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, nagu imelik see ka ei oleks, vastab lokaadile <em>&quot;C&quot;<\/em>, ja kogu n\u00e4ide seega l\u00e4bib ilma vigadeta. Milline m\u00fcstika.<\/p>\n<p><\/p>\n<p>Ma ei armasta m\u00fcstikat programmeerimises, kuna see varjab tavaliselt vigu. Pean t\u00f5siselt tegelema k\u00fcsimusega, kuidas see t\u00f6\u00f6tab <em>sort<\/em> ja millele see m\u00f5ju avaldab <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>L\u00f5puks p\u00fc\u00fcan vastata k\u00fcsimustele:<\/p>\n<p><\/p>\n<ul>\n<li>miks sorteeriti valej\u00e4rjekorras naissoost perekonnanimesid<\/li>\n<li>miks <em>LANG=ru_RU.CP1251<\/em> osutus ekvivalendiks <em>LANG=C<\/em><\/li>\n<li>miks on <em>sort<\/em> ja <em>liitu<\/em> erinevad arusaamad sorteeritud ridade j\u00e4rjekorrast<\/li>\n<li>miks k\u00f5igis mu n\u00e4idetes on vigu<\/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 Unicode'is<\/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, seega luban endale tuua l\u00fchikese \u00fclevaate p\u00f5hiteemadest.<\/p>\n<p><\/p>\n<p><em>Sorteerimine<\/em> \u2014 &quot;stringide v\u00f5rdlemine&quot; on iga sortimisalgoritmi aluseks. Igal algoritmil v\u00f5ivad olla erinevad l\u00e4henemisviisid (&quot;mulli&quot;, &quot;\u00fchendamine&quot;, &quot;kiire&quot;), kuid k\u00f5ik need kasutavad paari stringi v\u00f5rdlemist, et m\u00e4\u00e4rata nende j\u00e4rjestus.<\/p>\n<p><\/p>\n<p>Sorting strings in natural language is quite a complex issue. Even in the simplest single-byte encodings, the order of letters in an alphabet that differs from the English Latin alphabet won't match the numerical values by which these letters are encoded. For example, in the German alphabet, the letter <em>\u00d6<\/em> is positioned between <em>Umbes<\/em> ja <em>P<\/em>, while in the encoding <em>CP850<\/em> it falls between <em>\u00ff<\/em> ja <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>V\u00f5ib p\u00fc\u00fcda ignoreerida konkreetset kodeeringut ja vaadata &quot;ideaalseid&quot; t\u00e4hti, mis on kindlas j\u00e4rjekorras, nagu seda on tehtud Unicode'is. Kodeeringud <em>UTF8<\/em>, <em>UTF16<\/em> or single-byte <em>KOI8-R<\/em> (if a limited subset of Unicode is needed) will provide different numerical representations of letters but will refer to the same elements in the basic table. <\/p>\n<p><\/p>\n<p>Selgub, et isegi s\u00fcmbolite tabeli nullist koostamisel ei suuda me sellele m\u00e4\u00e4rata universaalset s\u00fcmbolite j\u00e4rjestust. Erinevates rahvuslikes t\u00e4hestikes, mis kasutavad samu t\u00e4hti, v\u00f5ib nende t\u00e4hede j\u00e4rjestus erineda. N\u00e4iteks prantsuse keeles <em>\u00c6<\/em> peetakse ligatuuriks ja seda sorteeritakse kui stringi. <em>AE<\/em>Taas, norski keeles <em>\u00c6<\/em> on see eraldi t\u00e4ht, mis paikneb p\u00e4rast <em>Z<\/em>. Muide, lisaks ligatuuridele nagu <em>\u00c6<\/em> on olemas t\u00e4hed, mis on kirjutatud mitme s\u00fcmboliga. Nii on T\u0161ehhi t\u00e4hestikus t\u00e4ht <em>Ch<\/em>, mis asub nende vahel <em>H<\/em> ja <em>I<\/em>.<\/p>\n<p><\/p>\n<p>Lisaks t\u00e4hestike erinevustele on olemas ka teised rahvuslikud traditsioonid, mis m\u00f5jutavad sorteerimist. Eriti t\u00f5statub k\u00fcsimus: millises j\u00e4rjekorras peaksid s\u00f5naraamatutes esinduma suurt\u00e4hed ja v\u00e4iket\u00e4hed? Samuti v\u00f5ivad sorteerimist m\u00f5jutada erim\u00e4rgid. Hispaania keeles asetatakse k\u00fcsimuse algusesse p\u00f6\u00f6ratud k\u00fcsim\u00e4rgi m\u00e4rk (<em>\u00bfTe gusta la m\u00fasica?<\/em>). Sel juhul on ilmne, et k\u00fcsimustikud ei peaks olema eraldi r\u00fchmitatud v\u00e4ljaspool t\u00e4hestikku, vaid kuidas j\u00e4rjestada ridu koos teiste kirjavahem\u00e4rgiga?<\/p>\n<p><\/p>\n<p>Ma ei kavatse peatuda ridade j\u00e4rjestamisele keeltes, mis erinevad tugevasti Euroopa keeltest. M\u00e4rgin, et paremale v\u00f5i \u00fclespoole kirjutamise suunaga keeltes hoitakse s\u00fcmboleid ridades t\u00f5en\u00e4oliselt lugemisj\u00e4rjestuses, ning ka mitte-t\u00e4heline kirjutamine omab oma viise ridade s\u00fcmbolite j\u00e4rjekorra seadmiseks. N\u00e4iteks v\u00f5ivad hierogl\u00fcfid olla j\u00e4rjestatud vastavalt kirjutusviisile (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">hiina hierogl\u00fcfide v\u00f5tmed<\/a><\/noindex>) v\u00f5i h\u00e4\u00e4ldusele. Kuidas emojid peaksid olema j\u00e4rjestatud, ma ausalt \u00f6eldes ei tea, kuid ka nende jaoks v\u00f5iks midagi v\u00e4lja m\u00f5elda.<\/p>\n<p><\/p>\n<p>\u00dclaltoodud omaduste p\u00f5hjal on v\u00e4lja t\u00f6\u00f6tatud peamised n\u00f5uded ridade v\u00f5rdlemiseks, mis p\u00f5hinevad Unicode tabelitel:<\/p>\n<p><\/p>\n<ul>\n<li>ridade 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 see on sama mis <em>\u00c5<\/em>);<\/li>\n<li>stringide v\u00f5rdlemisel v\u00f5etakse s\u00fcmbol arvesse kontekstis ja vajadusel \u00fchendatakse see naabers\u00fcmbolitega \u00fcheks v\u00f5rdlemise\u00fcksuseks (<em>Ch<\/em> t\u0161ehhi keeles) v\u00f5i jagatakse mitmeks (<em>\u00c6<\/em> prantsuse keeles);<\/li>\n<li>k\u00f5ik rahvuslikud omadused (t\u00e4hestik, suure-\/v\u00e4ikese t\u00e4htede erinevus, kirjavahem\u00e4rgid, kirjutamise viiside j\u00e4rjekord) peavad olema seadistatavad kuni k\u00e4sitsi m\u00e4\u00e4ratud j\u00e4rjekorrani (emoji);<\/li>\n<li>v\u00f5rdlemine on oluline mitte ainult sortimise jaoks, vaid ka paljude teiste kohtade jaoks, n\u00e4iteks stringide vahemike m\u00e4\u00e4ramiseks (asendus {A\u2026 \u044f} in <em>bash<\/em>);<\/li>\n<li>v\u00f5rdlemine peab toimuma piisavalt kiiresti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lisaks on aruande autorid formuleerinud v\u00f5rdlemise omadused, millele algoritmi arendajad ei peaks tuginema:<\/p>\n<p><\/p>\n<ul>\n<li>v\u00f5rdlemise algoritm ei tohiks n\u00f5uda iga keele jaoks eraldi s\u00fcmbolite kogumit (vene ja ukraina keel kasutavad suuresti samu kirillitsa s\u00fcmboleid);<\/li>\n<li>v\u00f5rdlemine ei tohiks tugineda s\u00fcmbolite j\u00e4rjekorrale Unicode tabelites;<\/li>\n<li>stringi kaal ei tohiks olla stringi atribuut, kuna sama string erinevates kultuurilistes kontekstides v\u00f5ib omada erinevat kaalu;<\/li>\n<li>tekstide kaalud v\u00f5ivad muutuda sulandumisel v\u00f5i jagunemisel (n\u00e4iteks <em>x<\/em> &lt; <em>y<\/em> ei t\u00e4henda, et <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>erinevad tekstid, millel on samad kaalud, loetakse sortimisalgoritmi seisukohalt v\u00f5rdsed. T\u00e4iendava j\u00e4rjestuse kehtestamine nende tekstide vahel on v\u00f5imalik, kuid see v\u00f5ib halvendada j\u00f5udlust;<\/li>\n<li>korduvate sortimiste puhul v\u00f5ivad v\u00f5rdselt kaalutud tekstid omavahel kohtasid vahetada. Stabiilsus on konkreetse sortimisalgoritmi omadus, mitte tekstide v\u00f5rdlemise algoritmi omadus (vt eelmist punkti);<\/li>\n<li>sortimisreeglid v\u00f5ivad aja jooksul muutuda kultuuriliste traditsioonide t\u00e4psustamise\/muutmise t\u00f5ttu.<\/li>\n<\/ul>\n<p><\/p>\n<p>Samuti on s\u00e4testatud, et v\u00f5rdlemisalgoritm ei tea midagi v\u00f5rreldavate tekstide semantikast. Seega ei tohiks numbritest koosnevaid tekstid v\u00f5rrelda numbritena ning ingliskeelsetes nimedes ei tohi artiklit v\u00e4lja j\u00e4tta (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>K\u00f5ikide t\u00f5statatud n\u00f5uete rahuldamiseks on v\u00e4lja t\u00f6\u00f6tatud mitmetasandiline (tegelikult neljatase) tabeli sortimisalgoritm.<\/p>\n<p><\/p>\n<p>Eelnevalt tuuakse stringi s\u00fcmbolid kanoniliseks ja r\u00fchmitatakse v\u00f5rdlemiseks \u00fchikuteks. Iga v\u00f5rdlus\u00fchikule omistatakse mitu kaalu vastavalt erinevatele v\u00f5rdlustasanditele. V\u00f5rdlus\u00fcksuste kaalud on j\u00e4rjestatud hulkade elemendid (antud juhul t\u00e4isarvud), mida saab v\u00f5rrelda suurem-v\u00e4hem suhtega. Eriline v\u00e4\u00e4rtus <em>IGNORED<\/em> (0x0) t\u00e4hendab, et vastaval v\u00f5rdlustasandil antud \u00fcksus ei osale v\u00f5rdluses. Stringide v\u00f5rdlemine v\u00f5ib toimuda korduvalt, kasutades vastavate tasemete kaalu. Iga taseme v\u00f5rdlus\u00fchikute kaalu v\u00f5rreldakse j\u00e4rjestikku omavahel.<\/p>\n<p><\/p>\n<p>Erinevates algoritmi rakendustes eri rahvuslike traditsioonide jaoks v\u00f5ivad koefitsientide suurused erineda, kuid Unicode'i standardisse kuulub p\u00f5hikaalu tabel \u2014 <em>&quot;Default Unicode Collation Element Table&quot;<\/em> (<em>DUCET<\/em>). Tahan m\u00e4rkida, et muutuja seadistamine <em>LC_COLLATE<\/em> on tegelikult viide kaalutabeli valimisele stringide v\u00f5rdluse funktsioonis.<\/p>\n<p><\/p>\n<p>Kaalukoefitsiendid <em>DUCET<\/em> on organiseeritud j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>esimese taseme puhul muudetakse k\u00f5ik t\u00e4hed \u00fchte soovitud suurusesse, diakriitilised m\u00e4rgid j\u00e4etakse v\u00e4lja, kirjavahem\u00e4rgid (kuid mitte k\u00f5ik) ignoreeritakse;<\/li>\n<li>teise taseme puhul arvestatakse ainult diakriitilisi m\u00e4rke;<\/li>\n<li>kolmanda taseme puhul arvestatakse ainult t\u00e4hte suurust;<\/li>\n<li>neljanda taseme puhul arvestatakse ainult kirjavahem\u00e4rke.<\/li>\n<\/ul>\n<p><\/p>\n<p>V\u00f5rdlemine toimub mitmes etapis: k\u00f5igepealt v\u00f5rreldakse esimesel tasemel koefitsiente; kui kaalud kokkusobivad, j\u00e4rgneb uuesti v\u00f5rreldes teisel tasemel; seej\u00e4rel v\u00f5ib l\u00e4bi viia ka kolmanda ja neljanda taseme.<\/p>\n<p><\/p>\n<p>V\u00f5rdlemine l\u00f5peb, kui ridades leidub vastanduvad v\u00f5rdlemise \u00fcksused erinevate kaalu j\u00e4rgi. Ridu, millel on k\u00f5ikidel neljal tasemel v\u00f5rdne kaal, peetakse \u00fcksteisega v\u00f5rdsed.<\/p>\n<p><\/p>\n<p>See algoritm (koos paljude lisatehniliste detailidega) andis aruande nr 10 nime \u2014 <em>&quot;Unicode Collation Algorithm&quot;<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>Selles kohas muutub meie n\u00e4ite sortimis k\u00e4itumine natuke arusaadavamaks. Oleks hea v\u00f5rrelda seda Unicode'i standardiga.<\/p>\n<p><\/p>\n<p>Teostuste testimiseks <em>UCA<\/em> on olemas spetsiaalne <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, kasutades <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">kaalu faili<\/a><\/noindex>, mis rakendab <em>DUCET<\/em>. Kaalu failis on erinevaid huvitavaid asju. N\u00e4iteks on seal m\u00e4nge mahjongi ja Euroopa domino joonestus ning kaardikomplekti mastide j\u00e4rjestus (s\u00fcmbol <em>1F000<\/em> ja edasi). Kaardimastid on paigutatud vastavalt brid\u017ei reeglitele \u2014 PCHBT, ning mastidesse kuuluvad kaardid on j\u00e4rjestatud j\u00e4rjehoidjate j\u00e4rgi T, 2, 3\u2026 K.<\/p>\n<p><\/p>\n<p>Reaalse ridade sortimise \u00f5iguse kontrollimine vastavalt <em>DUCET<\/em> oleks olnud \u00fcsna t\u00fc\u00fctu, kuid t\u00e4nu meile on olemas juhtiv teostus Unicode'i t\u00f6\u00f6tlemiseks \u2014 &quot;<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">International Components for Unicode<\/a><\/noindex>&quot; (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Selle raamatukogu veebisaidil, mis on loodud <em>IBM<\/em>, on demonstreerivad lehed, sealhulgas <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">stringide v\u00f5rdlemise algoritmi leht<\/a><\/noindex>. Sisestame meie testitavad stringid vaikeseadistustega ja, oh imet, saame ideaalse vene sortimise.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Mihhail;v\u00e4rvimees\nJolkina Ella;kraanaoperaator\nIvanov Andre;torumees\nIvanova Alla;advokaat<\/code><\/pre>\n<p><\/p>\n<p>Muide, saidilt <em>ICU<\/em> v\u00f5ib leida t\u00e4psustusi v\u00f5rdlemise algoritmi t\u00f6\u00f6 kohta kirjavahem\u00e4rkide k\u00e4sitlemisel. N\u00e4iteks <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">Collation FAQ<\/a><\/noindex> ignoreeritakse apostroof ja sidekriips.<\/p>\n<p><\/p>\n<p>Unikood aitas meid, kuid kummalise k\u00e4itumise p\u00f5hjuseid <em>sort<\/em> \u00fches <em>Linux<\/em> peab otsima mujalt.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Sortimine glibc<\/h1>\n<p><\/p>\n<p>Kiire \u00fclevaade t\u00f6\u00f6riista l\u00e4htekoodidest <em>sort<\/em> kohast <em>GNU Core Utils<\/em> n\u00e4itas, et t\u00f6\u00f6riist ise lokaliseerimine piirneb praeguse muutuja v\u00e4\u00e4rtuse prindimisega <em>LC_COLLATE<\/em> k\u00e4ivitamisel silumisre\u017eiimis:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: kasutab \u2018en_US.UTF8\u2019 sorteeringureegleid<\/code><\/pre>\n<p><\/p>\n<p>Stringide v\u00f5rdlemine toimub standardse funktsiooni <em>strcoll<\/em>, seega on k\u00f5ik huvitav juba raamatukogus <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>VDS-l on v\u00f5imalik installida: <em>wiki<\/em> projekt <em>glibc<\/em> stringide v\u00f5rdlemisega tegeleb <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">\u00fcks l\u00f5ik<\/a><\/noindex>. Sellest l\u00f5igust v\u00f5ib j\u00e4reldada, et <em>glibc<\/em> sorteerimine p\u00f5hineb juba tuttaval algoritmil <em>UCA<\/em> (<em>The Unicode collation algorithm<\/em>) ja\/v\u00f5i sarnasel standardil <em>ISO 14651<\/em> (<em>Rahvusvaheline stringide j\u00e4rjestamine ja v\u00f5rdlemine<\/em>). Mis puudutab viimast standardit, siis tuleks m\u00e4rkida, et saidil <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> on ametlikult kuulutatud avalikuks, kuid vastav link viib olematusse lehte. Google annab mitu lehte, kus on lingid ametlikele saitidele, mis pakuvad standardi elektroonilise koopia ostmist sada eurot, kuid kolmanda-neljanda lehe otsingutulemustes leiab ka otse lingid <em>PDF<\/em>. \u00dcldiselt ei erine standard praktiliselt <em>UCA<\/em>, kuid loetakse igavamalt, kuna see ei sisalda silmapaistvaid n\u00e4iteid riiklike erip\u00e4rade sorteerimisel. <\/p>\n<p><\/p>\n<p>K\u00f5ige huvitavam teave oli <em>wiki<\/em> link <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">vea j\u00e4lgimise s\u00fcsteemile<\/a><\/noindex> stringide v\u00f5rdlemise rakendamise arutamiseks <em>glibc<\/em>. Arutelust selgub, et <em>glibc<\/em> stringide v\u00f5rdlemiseks kasutatakse <em>ISO<\/em>\u00fcht tabelit <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">Common Template Table<\/a><\/noindex> (<em>CTT<\/em>), mille aadressi leiate rakendusest <em>A<\/em> standardist <em>ISO 14651<\/em>. Aastatel 2000 kuni 2015 ei olnud sellel tabelil hooldajat ja see erineb m\u00e4rgatavalt (v\u00e4hemalt visuaalselt) praegusest standardi versioonist. Aastatel 2015 kuni 2018 toimus kohandamine uue versiooni tabeliga ja hetkel on teil v\u00f5imalus kohtuda reaalses elus nii uue versiooniga ( <em>glibc<\/em> ) kui ka vanaga (<em>CentOS 8<\/em>N\u00fc\u00fcd, kui kogu teave algoritmi ja abitablettide kohta on olemas, saame naasta algse probleemi juurde ja m\u00f5ista, kuidas \u00f5igesti j\u00e4rjestada stringe vene lokaalis.<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>ISO 14651\/14652<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">Meid huvitava tabeli l\u00e4htekood<\/h1>\n<p><\/p>\n<p>enamikus distributsioonides <em>CTT<\/em> asub kataloogis <em>Linux<\/em> . Ainult tabel asub failis <em>\/usr\/share\/i18n\/locales\/<\/em>iso14651_t1_common <em>. Seej\u00e4rel kaasatakse see fail direktiiviga<\/em>copy iso14651_t1_common <em>faili<\/em> iso14651_t1 <em>, mis omakorda on kaasatud riiklikele failidele, sealhulgas<\/em>. Enamikus distributsioonides <em>en_US<\/em> ja <em>et_RU<\/em>. Enamikus jaotustes <em>Linux<\/em> k\u00f5ik algfailid on lisatud p\u00f5hivaru, kuid kui neid pole, peate installima t\u00e4iendava paketi jaotusest.<\/p>\n<p><\/p>\n<p>Faili struktuur <em>, mis omakorda on kaasatud riiklikele failidele, sealhulgas<\/em> see v\u00f5ib tunduda kohutavalt s\u00f5nakas, ebamugavate nimevormingureeglitega, kuid kui vaadata, on see piisavalt lihtne. Struktuur on kirjeldatud standardis <em>ISO 14652<\/em>, mida saab alla laadida veebisaidilt <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. Veel \u00fcht faili formaadi kirjelduse saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">spetsifikatsioonides<\/a><\/noindex> <em>POSIX<\/em> alates <em>OpenGroup<\/em>. Standardi lugemise alternatiivina saab uurida funktsiooni allikaid <em>collate_read<\/em> \u00fches <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Faili struktuur n\u00e4eb v\u00e4lja j\u00e4rgmine:<\/p>\n<p><\/p>\n<p>Vaikimisi kasutatakse s\u00fcmbolit  kui maskeerimiss\u00fcmbolit ning reavahetus s\u00fcmbolist # on kommentaar. M\u00f5lemat s\u00fcmbolit saab \u00fcle kirjutada, nagu on tehtud uues tabeli versioonis:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>Failis v\u00f5ivad esineda tokenid formaadis <em>&lt;Uxxxx&gt;<\/em> v\u00f5i <em>&lt;Uxxxxxxxx&gt;<\/em> (kus <em>x<\/em> \u2014 kuusnurkne number). See on kuusnurkne esitus Unicode'i koodipunktide <em>UCS-4<\/em> (<em>UTF-32<\/em>). K\u00f5ik \u00fclej\u00e4\u00e4nud elemendid nurgasulgudes (sealhulgas <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> ja sarnased) on peetud lihtsakste stringikonspektideks, millel ei ole konteksti v\u00e4ljaspool erilist t\u00e4hendust.<\/p>\n<p><\/p>\n<p>String <em>LC_COLLATE<\/em> \u00fctleb meile, et edasi algavad andmed, mis kirjeldavad stringide v\u00f5rdlemist.<\/p>\n<p><\/p>\n<p>Esiteks m\u00e4\u00e4ratakse kaalu nimed v\u00f5rdlustabelis ning t\u00e4hem\u00e4rkide kombinatsioonide nimed. \u00dcldiselt kuuluvad kaks t\u00fc\u00fcpi nimesid kahele erinevale entiteedile, kuid tegelikus failis on need segamini. Kaalu nimed m\u00e4\u00e4ratakse m\u00e4rks\u00f5naga <em>collating-symbol<\/em> (v\u00f5rdlemise s\u00fcmbol), kuna Unicode'i s\u00fcmbolid, millel on samad kaalud, peetakse ekvivalentseteks s\u00fcmboliteks.<\/p>\n<p><\/p>\n<p>Jooksva faili versiooni sektsiooni kogupikkus on umbes 900 rida. Olen v\u00f5tnud n\u00e4iteid mitmest kohast, et n\u00e4idata nimede meelevaldsust ja mitut 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\u00fcmboli v\u00e4\u00e4rtus. Hoia selle loendi l\u00f5pus\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 stringi <em>OSMANYA<\/em> kaalu nimede tabelis <\/li>\n<li><em>collating-symbol ..<\/em> registreerib nimej\u00e4rjestuse, mis koosneb eesliitest <em>S<\/em> ja kuuek\u00fcmnendk\u00fcmnendast numbrilisest sufiksist alates <em>1D000<\/em> kuni <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> \u00fches <em>collating-symbol<\/em> n\u00e4eb v\u00e4lja nagu suur m\u00e4rkidevaheline t\u00e4isarv kuuek\u00fcmnendk\u00fcmnendises 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 koodpunkti 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\u00e4ratud, m\u00e4\u00e4ratakse kaalud ise. Kuna v\u00f5rdlemisel on oluline ainult suurem-v\u00e4hem suhe, m\u00e4\u00e4ratakse kaalud lihtsa nimede j\u00e4rjestamisega. Esiteks loetletakse kergeid kaalusid, seej\u00e4rel raskemaid. Pean meeles, et igale Unicode'i s\u00fcmbolile omistatakse neli erinevat kaalu. Need on koondatud \u00fchte j\u00e4rjestatud j\u00e4rjestusse. Teoreetiliselt v\u00f5ib igasuguseid s\u00fcmboleid kasutada igal neljal tasemel, kuid kommentaarides m\u00e4rgitakse, et arendajad eristavad nimesid m\u00f5ttes tasemete j\u00e4rgi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% S\u00fcmbolite kaalude m\u00e4\u00e4ramine\n\n% Kolmanda taseme kaalude m\u00e4\u00e4ramine\n\n\n\n\n...\n% Teise taseme kaalude m\u00e4\u00e4ramine\n\n % \u00dcHENDAMINE MADALALINNA\n % \u00dcHENDAMINE KOMA \u00dcLE\n % \u00dcHENDAMINE P\u00d6\u00d6RDKOMA \u00dcLE\n...\n% Esimese taseme kaalude m\u00e4\u00e4ramine\n % HORIZONTAL TABULATSIOON\n % RIDA KATKESTUS\n % VERTIKAALNE TABULATSIOON\n...\n % K\u00dcRILI KERGE T\u00c4HE DE\n % K\u00dcRILI KERGE T\u00c4HE KOMI DE\n % K\u00dcRILI KERGE T\u00c4HE DJE\n % K\u00dcRILI KERGE T\u00c4HE KOMI DJE\n % K\u00dcRILI KERGE T\u00c4HE GJE\n % K\u00dcRILI KERGE T\u00c4HE ZE KAEGA\n % K\u00dcRILI KERGE T\u00c4HE IE\n % K\u00dcRILI KERGE T\u00c4HE IE BREVEGA\n % K\u00dcRILI KERGE T\u00c4HE UKRAINLAINE IE\n % K\u00dcRILI KERGE T\u00c4HE ZHE<\/code><\/pre>\n<p><\/p>\n<p>L\u00f5puks on ise kaalu tabel.<\/p>\n<p><\/p>\n<p>Kaalude sektsioon on raamis koos m\u00e4rks\u00f5nadega <em>order_start<\/em> ja <em>order_end<\/em>. T\u00e4iendavad parameetrid <em>order_start<\/em> m\u00e4\u00e4ravad, millises suunas ridasid igal v\u00f5rreldava tasemel vaadataks. Vaikes\u00e4tetena kasutatakse parameetrit <em>forward<\/em>. Sektsiooni sisu koosneb ridadest, mis sisaldavad s\u00fcmbolikoodi ja nelja selle kaalu. S\u00fcmbolikood v\u00f5ib olla esindatud s\u00fcmbol ise, koodipunkt v\u00f5i varasemalt m\u00e4\u00e4ratletud s\u00fcmboolne nimi. Kaaled saab samuti m\u00e4\u00e4rata s\u00fcmboolsete nimede, koodipunktide v\u00f5i ise s\u00fcmbolite kaudu. Kui kasutatakse koodipunkte v\u00f5i s\u00fcmboleid, on nende kaal koosk\u00f5las koodipunkti numbrilise v\u00e4\u00e4rtusega (positsioonis Unicode tabelis). Ekslikult mitte\u00fcles m\u00e4rgitud s\u00fcmbolid (nagu ma aru saan) loetakse tabelis, mille esmane kaal vastab nende positsioonile Unicode tabelis. Eriline kaal v\u00e4\u00e4rtus <em>IGNORE<\/em> t\u00e4hendab, et vastaval v\u00f5rdlustasemel antud s\u00fcmbolit ignoreeritakse.<\/p>\n<p><\/p>\n<p>Kaalustruktuuri demonstreerimiseks valisin kolm piisavalt selget fragmenti:<\/p>\n<p><\/p>\n<ul>\n<li>s\u00fcmbolid, mida ignoreeritakse t\u00e4ielikult<\/li>\n<li>s\u00fcmbolid, mis on ekvivalentne numbriga kolm esimesel kahel tasemel<\/li>\n<li>vene t\u00e4hestiku algus, mis ei sisalda diakriitilisi m\u00e4rke ja seet\u00f5ttu sorteeritakse peamiselt esimese ja kolmanda taseme j\u00e4rgi.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">tellimus_algus edasi;edasi;edasi;edasi,positsioon\n IGNORE;IGNORE;IGNORE;IGNORE % NULL (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % PEALKIRJA ALGUS (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % TEKSTI ALGUS (in 6429)\n...\n ;; ;  % KOLMOND DIGIT \n ;; ;  % T\u00c4IESTI KOLME FULLWIDTH \n ;; ;  % KOLMNEDA P\u00c4RA KOLM \n ;; ;  % KOLME KOLME PUNKT \n ;; <FONT>;  % MATEMAACOLILLA BOLD DIGIT KOLM\n...\n ;; ;  % KIRILL SILMINE A \n ;; ;  % KIRILL SUUR A \n ;; ;  % KIRILL SILMINE A K\u00c4RGIK \n ;; ;  % KIRILL SILMINE A K\u00c4RGIK\n...\n ;; ;  % KIRILL SILMINE BE \n ;; ;  % KIRILL SUUR BE \n ;; ;  % KIRILL SILMINE VE \n ;; ;  % KIRILL SUUR VE\n...\ntellimus_l\u00f5pp<\/code><\/pre>\n<p><\/p>\n<p>N\u00fc\u00fcd on taas v\u00f5imalik naasta artikli alguses esitatud n\u00e4idete j\u00e4rjestusse. Probleem peitub selles osas kaalu tabelis:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">IGNORE;IGNORE;IGNORE; % RUUM \n IGNORE;IGNORE;IGNORE; % K\u00dcSIMUSM\u00c4RK \n IGNORE;IGNORE;IGNORE; % TSITAAT\n...<\/code><\/pre>\n<p><\/p>\n<p>On m\u00e4rgata, et selles tabelis ignoreeritakse interpunktsiooni tavaliselt, <em>ASCII<\/em> (sealhulgas t\u00fchik) stringide v\u00f5rdlemisel. Eranditeks on vaid stringid, mis on t\u00e4ielikult identsed, v\u00e4lja arvatud vastavates positsioonides esinevad interpunktsioonim\u00e4rgid. Minu n\u00e4ite stringid (p\u00e4rast sorteerimist) n\u00e4evad v\u00e4lja j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMikhailPainters\nYolkinaElenaScreenwriter\nIvanovaAllaPainter\nIvanovAndreyJoiner<\/code><\/pre>\n<p><\/p>\n<p>Arvestades, et kaalutabelis on vene keeles suured t\u00e4hed v\u00e4ikeste t\u00e4htede j\u00e4rel (kolmandal tasemel <em>&lt;CAP&gt;<\/em> k\u00f5vemad kui <em>&lt;MIN&gt;<\/em>), siis n\u00e4eb sorteerimine v\u00e4lja t\u00e4iesti korrektne.<\/p>\n<p><\/p>\n<p>Muutes muutuja <em>LC_COLLATE=C<\/em> laaditakse eriline tabel, mis m\u00e4\u00e4rab byte-taseme 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 asub koodipunkt \u0401 koha j\u00e4rjekorras A ees, j\u00e4rjestatakse ka stringid vastavalt.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Teksti- ja binaartabelid<\/h1>\n<p><\/p>\n<p>On selge, et stringide v\u00f5rdlemine on \u00e4\u00e4rmiselt sage toiming, samas kui tabeli anal\u00fc\u00fcs <em>CTT<\/em> on \u00fcsna kulukas protseduur. Tabeli juurdep\u00e4\u00e4su optimeerimiseks kompileeritakse see kahekordsesse vormingusse k\u00e4suga <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Meeskond <em>localedef<\/em> millele antakse parameetritena fail, mis sisaldab riiklike erip\u00e4rade tabelit (valik <em>-i<\/em>), milles k\u00f5ik s\u00fcmbolid on esitatud Unicode'i punktidena, ja fail, mis seob Unicode'i punkte konkreetse kodeeringu s\u00fcmbolitega (valik <em>-f<\/em>). T\u00f6\u00f6 tulemusena luuakse kohalikuks kaksikfailid, mille nimi on m\u00e4\u00e4ratud viimasena antud parameetris.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> toetab kahte binaarfailide formaati: &quot;traditsiooniline&quot; ja &quot;kaasaegne&quot;.<\/p>\n<p><\/p>\n<p>Traditsiooniline formaat eeldab, et lokaali nimi on alamkausta nimi <em>\/usr\/lib\/locale\/<\/em>. Selles alamkaustas hoitakse kaksikfailid <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> ja nii edasi. 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 on salvestatud \u00fchte arhiivi <em>\/usr\/lib\/locale\/locale-archive<\/em>, mis on kaardistatud k\u00f5igi protsesside virtuaalsesse m\u00e4lu, mis seda kasutavad. <em>glibc<\/em>. Keelja on kaasaegses formaadis l\u00e4bi teinud teatud kanoniseerimise \u2013 kodeeringu nimedes j\u00e4\u00e4vad alles vaid numbrid ja t\u00e4hed, mis on muudetud v\u00e4iket\u00e4htedeks. Nii <em>ru_RU.KOI8-R<\/em>, salvestatakse j\u00e4rgmiselt <em>ru_RU.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Sisendfailid otsitakse praegusest kataloogist ning ka kataloogidest <em>\/usr\/share\/i18n\/locales\/<\/em> ja <em>\/usr\/share\/i18n\/charmaps\/<\/em> failide <em>CTT<\/em> ja kodeerimisfailide jaoks 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> nimega <em>ru_RU.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Kui seadistada muutujaks <em>LANG=en_US.UTF-8<\/em> siis <em>glibc<\/em> otsitakse lokaali binaarfailide jaoks j\u00e4rgmises failide ja kataloogide j\u00e4rjestuses:<\/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 traditsioonilises kui ka kaasaegses formaadis, antakse eelis kaasaegsele.<\/p>\n<p><\/p>\n<p>Kompileeritud lokaalide loendit saab vaadata k\u00e4suga <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">Oma v\u00f5rdlustabeli koostamine<\/h1>\n<p><\/p>\n<p>N\u00fc\u00fcd, relvastatuna teadmistega, on v\u00f5imalik luua oma ideaalne stringide v\u00f5rdlustabel. See tabel peab \u00f5igesti v\u00f5rdlema vene t\u00e4hti, sealhulgas t\u00e4hti \u0401, ning arvestama loetlemism\u00e4rke vastavalt tabeliga <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Oma sortimistabeli ettevalmistamise protsess koosneb kahest etapist: kaalutabeli redigeerimisest ja selle kompileerimisest binaarvormis k\u00e4suga <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Et v\u00f5rdlustabelit oleks v\u00f5imalik kohandada minimaalse redigeerimiskuluga, on formaadis <em>ISO 14652<\/em> ette n\u00e4htud juba olemasoleva tabeli kaalude kohandamise sektsioonid. Sektsioon algab v\u00f5tmes\u00f5nast <em>reorder-after<\/em> ja positsiooni n\u00e4itamisest, mille j\u00e4rel toimub asendamine. Sektsiooni l\u00f5petab rida <em>reorder-end<\/em>. Kui on vaja korrigeerida mitu tabeli osa, luuakse iga sellise osa jaoks oma sektsioon.<\/p>\n<p><\/p>\n<p>Kopeerisin uued versioonid failidest <em>. Seej\u00e4rel kaasatakse see fail direktiiviga<\/em> ja <em>et_RU<\/em> hoidlast <em>glibc<\/em> oma kodukatalooge ~\/.local\/share\/i18n\/locales\/ ja muutsin veidi jaotust <em>LC_COLLATE<\/em> \u00fches <em>et_RU<\/em>. Uued faili versioonid on t\u00e4ielikult \u00fchilduvad minu versiooniga <em>glibc<\/em>. Kui soovite kasutada vanu faili versioone, peate muutma s\u00fcmboolseid nimesid ja kohta, kust asendamine tabelis algab.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Kopeeri mall ISO\/IEC 14651-st\ncopy &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; % K\u00dcSIMISM\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 KURVIT\u00c4HT\n&lt;U007E&gt; &lt;S007E&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007E&gt; % TILDA\nreorder-end\nEND LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>Tegelikult oleks pidanud muutma v\u00e4ljad <em>LC_IDENTIFICATION<\/em> niimoodi, et need viitaksid lokaalile <em>ru_MY<\/em>, kuid minu n\u00e4ites ei olnud see vajalik, kuna ma v\u00e4listasin otsingust lokaliseerimise arhiivi <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Et <em>localedef<\/em> t\u00f6\u00f6tasin failidega oma kaustas l\u00e4bi muutuja <em>I18NPATH<\/em> v\u00f5ib lisada t\u00e4iendava katalooge sisendfailide otsimiseks, ja katalooge binaarfailide salvestamiseks v\u00f5ib m\u00e4\u00e4rata teena, mis sisaldab kaldkriipse:<\/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<\/em> eeldab, et <em>LANG<\/em> v\u00f5ib kirjutada absoluutsete teedena kataloogidele, kus asuvad lokaalid, mis algavad otsekaldkriipsuga, kuid <em>glibc<\/em> \u00fches <em>Linux<\/em> k\u00f5ik teed arvestatakse baas-kataloogist, mille v\u00f5ib \u00fcletada muutuja <em>LOCPATH<\/em>. P\u00e4rast seadistamist <em>LOCPATH=~\/.local\/lib\/locale\/<\/em> otsitakse k\u00f5iki lokaliseerimisega seotud faile ainult minu kaustast. Lokaalide arhiiv, kui muutuja on seadistatud. <em>LOCPATH<\/em> ei arvestata.<\/p>\n<p><\/p>\n<p>See test on:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=et_EE.UTF-8 LOCPATH=~\/.local\/lib\/locale\/ sort buhg.txt\nAbakanov Mihhail;v\u00e4rvija\nJolkina Ella;kraanajuht\nIvanov Andrei;sepp\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\">Vigade parandamine<\/h1>\n<p><\/p>\n<p>Olen juba vastanud alguses esitatud stringi sortimise k\u00fcsimustele, kuid veel on m\u00f5ned k\u00fcsimused n\u00e4htavatest ja n\u00e4htamatutest vigadest.<\/p>\n<p><\/p>\n<p>Naaseme algse \u00fclesande juurde.<\/p>\n<p><\/p>\n<p>Ja programm <em>sort<\/em> ja programm <em>liitu<\/em> kasutavad samu stringi v\u00f5rdlemise funktsioone <em>glibc<\/em>. Kuidas juhtus, et <em>liitu<\/em> andis sortimisvea stringidele, mis sorteeriti k\u00e4suga <em>sort<\/em> j\u00e4rgi lokaalis <em>et_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> v\u00f5rdleb stringi tervikuna, samas kui <em>liitu<\/em> v\u00f5rdleb ainult v\u00f5tit, mis vaikimisi on stringi algus kuni esimese t\u00fchikuni. Minu n\u00e4ites viis see veateadeni, kuna lause algusede sortimine ei kattunud t\u00e4ielike stringide sortimisega.<\/p>\n<p><\/p>\n<p>Lokaal <em>&quot;C&quot;<\/em> garanteerib, et sorteeritud ridade algusosad kuni esimese t\u00fchikuni on samuti sorteeritud, kuid see varjab viga. On v\u00f5imalik leida selliseid andmeid (inimesed, kellel on sama perekonnanimi, kuid erinevad eesnimed), mis ilma veateateta tooksid vale tulemuse failide \u00fchinemisel. Kui soovime, et <em>liitu<\/em> \u00fchendaks failide ridu FIO j\u00e4rgi, siis \u00f5ige viis on selgelt m\u00e4\u00e4ratleda v\u00e4ljade eraldaja ja sorteerida v\u00f5tmev\u00e4lja j\u00e4rgi, mitte kogu rida j\u00e4rgi. Sel juhul toimub \u00fchinemine \u00f5igesti ja ei esine vigu \u00fcheski lokaadis:<\/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\u00e4bi viidud n\u00e4ide kodeeringus <em>CP1251<\/em> sisaldab veel \u00fchte viga. Asi on selles, et k\u00f5igis tuntud distributsioonides <em>Linux<\/em> puuduvad pakettides kompileeritud lokaalid <em>ru_RU.CP1251<\/em>. Kui kompileeritud lokaali ei leita, siis <em>sort<\/em> kasutab vaikselt byte-per-byte v\u00f5rdlemist, mida me ka j\u00e4lgisime.<\/p>\n<p><\/p>\n<p>Muide, on veel \u00fcks v\u00e4ike viga, mis on seotud kompileeritud lokaalide k\u00e4ttesaamatusega. K\u00e4sk <em>LOCPATH=\/tmp locale -a<\/em> v\u00e4ljastab k\u00f5ik lokaalid <em>locale-archive<\/em>, kuid eeldusel, et muutujat on seadistatud <em>LOCPATH<\/em> k\u00f5ikidele programmidele (ka k\u00f5igele <em>locale<\/em>) need lokaalid ei ole 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 on harjunud arvama, et stringid on baitide kogum, siis on see sinu valik. <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>Kui oled lingvist v\u00f5i s\u00f5naraamatute koostaja, siis oleks parem, kui compileeriksid oma lokaali.<\/p>\n<p><\/p>\n<p>Kui oled lihtsalt kasutaja, siis piisab, kui harjuda, et k\u00e4sk <em>ls -a<\/em> v\u00e4ljastab faile, mis algavad punktiga, segatuna failidega, mis algavad t\u00e4hega, ning <em>Midnight Commander<\/em>, mis kasutab oma sisemisi funktsioone nimede sortimiseks, toob failid, mis algavad punktiga, nimekirja algusesse.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Lingid<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Aruanne nr 10 Unicode kollektsiooni algoritm <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">T\u00e4htede kaaluudised unicode.org <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/intro\"><em>ICU<\/em> \u2014 IBM-i Unicode'i t\u00f6\u00f6tlusraamatukogu rakendus. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Sortimise test <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\">T\u00e4htede kaalud <em>ISO 14651<\/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\">Failivormingu 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\">Arutelu stringide v\u00f5rdlemise \u00fcle <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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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 teavet t\u00f6\u00f6tajate e-posti aadresside kohta, mis p\u00e4rinevad postitusloendi kasutajate loendist, ja t\u00f6\u00f6tajate ametikohtade kohta, mis on saadud personaliosakonna andmebaasist. M\u00f5lemad loendid on eksporditud tekstifailideks Unicode UTF-8 kodeeringus ja salvestatud Unix'i l\u00f5ppudega. Sisu mail.txt Ivanov Andre;ia@example.com Sisu buhg.txt Ivanova Alla;maalija J\u00f5ulukuuse all","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 \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","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"},"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}]}}