जहां कुछ यूनिकोड वर्णों के साथ मेरी `यूनीक` या` सॉर्ट -यू` लाइन चली गई है


10

निम्नलिखित कोड स्निपेट में क्या हो रहा है? मुझे मेरा अपेक्षित आउटपुट नहीं मिल रहा है।

मुझे लगता है कि यह एक बग था, लेकिन यह 2 अलग-अलग कार्यक्रमों (यूनीक और सॉर्ट) के लिए होता है, इसलिए मुझे संदेह है कि इसके साथ कुछ करना है ... ठीक है, मुझे नहीं पता कि क्या है .. इसलिए सवाल।

पहले 3 (4 में से) उदाहरण काम करते हैं, लेकिन 4 फेल है!।

मैं किसी भी और सभी पात्रों के लिए समान व्यवहार की उम्मीद करूंगा।
अर्थात। (इनपुट की 3 लाइनों से) 2 लाइनों बाहर मुद्रित करने के लिए ... लेकिन 4 मामले में, मैं सिर्फ 1 लाइन (दोनों के लिए मिलता है sort -uऔर uniq); दो समान लिंस गायब हो जाते हैं!

मैंने आउटपुट '\ n' को दृश्य की कॉम्पैक्टीनेस के लिए स्थान में बदल दिया है।

मैं uniq और (GNU coreutils) 7.4 से सॉर्ट कर रहा हूँ ... Ubuntu 10.04.3 LTS डेस्कटॉप पर चल रहा है।

लिपी:

{
  locale -k LC_COLLATE
  echo
  for c1 in x 〼 ;do 
    for c2 in z 〇 ;do 
      echo -n "asis   : "; echo -e "$c1\n$c2\n$c2"          |tr '\n' ' ';echo
      echo -n "uniq   : "; echo -e "$c1\n$c2\n$c2" |uniq    |tr '\n' ' ';echo
      echo -n "sort -u: "; echo -e "$c1\n$c2\n$c2" |sort -u |tr '\n' ' ';echo
      echo
    done
    echo
  done
}

उत्पादन:

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2081
collate-codeset="UTF-8"

asis   : x z z 
uniq   : x z 
sort -u: x z 

asis   : x 〇 〇 
uniq   : x 〇 
sort -u: 〇 x 


asis   : 〼 z z 
uniq   : 〼 z 
sort -u: 〼 z 

asis   : 〼 〇 〇 
uniq   : 〼 
sort -u: 〼 

# In the last example (of 4) where did the '〇' go? .. U+3007 IDEOGRAPHIC NUMBER ZERO
#

कृपया ध्यान दें .. इसे काफी स्पष्ट करने के लिए। sortअकेले (बिना -u विकल्प) ... वर्ण हडप जाना नहीं है .. क्या में चला जाता है, बाहर आता है ... लेकिन, जैसा कि उम्मीद की जा सकती द्वारा गाइल्स होने "विदेशी" यूनिकोड वर्ण की व्याख्या एक ही विहित मूल्य , इन वर्णों को क्रमबद्ध नहीं किया जाता है, इसके अलावा वे आउटपुट के "टॉप" के लिए सॉर्ट किए गए फ़िफ़ो समूह के रूप में आउटपुट होते हैं ... इसलिए यहां वास्तव में दो मुद्दे हैं: 1. वर्ण सॉर्ट नहीं किए जाते हैं जैसा कि "भोली हो सकता है" "अपेक्षित, और 2. दोनों की" अनूठी "विशेषता sortऔर uniqडेटा खोना (कुछ मामलों में)।
पीटर।

अद्यतन: जैसा कि गिल्स (जब स्थानीय-विशिष्ट छँटाई आवश्यक नहीं है, और वर्ण क्रम उपयुक्त है) के रूप में उल्लेख किया गया है , sort -uऔर इसके uniqसाथ ठीक काम करते हैं: LC_COLLATE=C; echo -e "〼\n〇\n〇" |sort -u(या |uniq)
पीटर।

जवाबों:


11

लघु संस्करण: कोलाज वास्तव में कमांड लाइन उपयोगिताओं में काम नहीं करता है।

लंबा संस्करण: दो तारों की तुलना करने का अंतर्निहित कार्य है strcoll। विवरण बहुत उपयोगी नहीं है, लेकिन ऑपरेशन की वैचारिक विधि दोनों तारों को एक विहित रूप में परिवर्तित करना है, और फिर दोनों विहित रूपों की तुलना करना है। फ़ंक्शन strxfrmइस विहित रूप का निर्माण करता है ।

आइए कुछ स्ट्रिंग्स के कैनोनिकल रूपों का निरीक्षण करें (डेब्यू निचोड़ के तहत GNU libc के साथ):

$ export LC_ALL=en_US.UTF-8
$ perl -C255 -MPOSIX -le 'print "$_ ", unpack("h*", strxfrm($_)) foreach @ARGV' b a A à 〼 〇
b d010801020
a c010801020
A c010801090
à 101010102c6b
〼 101010102c6b102c6b102c6b
〇 101010102c6b102c6b102c6b

जैसा कि आप देख सकते हैं, 〼 और 〇 का एक ही विहित रूप है। मुझे लगता है कि ऐसा इसलिए है क्योंकि इन पात्रों का उल्लेख en_US.UTF-8लोकेल के टकराव की तालिकाओं में नहीं है । हालाँकि, वे एक जापानी स्थान में मौजूद हैं।

$ export LC_ALL=ja_JP.UTF-8
$ perl -C255 -MPOSIX -le 'print "$_ ", unpack("h*", strxfrm($_)) foreach @ARGV' 〼 〇 
〼 303030
〇 3c9b

लोकेल डेटा का स्रोत कोड (डेबियन निचोड़ में) है /usr/share/i18n/locales/en_US, जिसमें शामिल हैं /usr/share/i18n/locales/iso14651_t1_common। इस फ़ाइल में U3007या के लिए कोई प्रविष्टि नहीं है U303C, और न ही वे किसी भी सीमा में शामिल हैं जो मुझे मिल सकता है।

मैं कोलाजेशन ऑर्डर बनाने के लिए नियमों से परिचित नहीं हूं , लेकिन मैं जो समझता हूं, उससे संबंधित है

UNDEFINED के प्रतीक की व्याख्या सभी कोडित वर्ण सेट मानों सहित की जाएगी जो स्पष्ट रूप से या दीर्घवृत्त चिह्न के माध्यम से निर्दिष्ट नहीं किए गए हैं। (…) यदि कोई UNDEFINED प्रतीक निर्दिष्ट नहीं है, और वर्तमान कोडित वर्ण सेट में इस खंड में निर्दिष्ट वर्ण शामिल नहीं हैं, तो उपयोगिता चेतावनी संदेश जारी करेगी और ऐसे वर्णों को वर्णसंबंध क्रम के अंत में रख देगी।

ऐसा लगता है कि Glibc इसके बजाय उन पात्रों की अनदेखी कर रहा है जो निर्दिष्ट नहीं हैं। मुझे नहीं पता कि अगर पोसिक्स कल्पना की मेरी समझ का दोष है, अगर मुझे ग्लिबक की स्थानीय परिभाषा में कुछ याद आया है, या अगर ग्लिबक लोकेल कंपाइलर में कोई बग है।


@ गिल्स: जानकारीपूर्ण और विस्तृत विवरण के लिए धन्यवाद .. यह अब कुछ समझ में आता है, लेकिन मैं सोच रहा हूँ, कैसे "सुरक्षित" उपयोग सॉर्ट करने के लिए .. मैं एक विशेष रूप से "स्थानीय संवेदनशील" प्रकार के बाद नहीं हूँ, इसलिए किसी भी तरह सॉर्ट करना होगा ... क्या इसके लिए एक त्वरित समाधान है? ... और मैं धीरे-धीरे इसे लटका दूंगा, लेकिन यह 'रातोरात' नहीं होगा ... उदा .. मेरे / usr / शेयर / i18n / चार्मैप्स / UTF-8 में दोनों वर्णों के संदर्भ शामिल हैं , लेकिन इस UTF-8 परिभाषा (?) में होने के नाते मदद करने के लिए प्रतीत नहीं होता है ... ओह ठीक है, अपने छोटे रहस्यों के बिना जीवन कैसा होगा। :) ...
पीटर।

1
@ यदि टकराव के charmaps/UTF-8बारे में कुछ भी नहीं कहा जाता है, तो यह locales/en_USमायने रखता है। का पहला नियम LC_COLLATEहै: उपयोग न करें LC_COLLATE। C (= POSIX) लोकेल में, उचित है (संख्यात्मक चरित्र मानों पर सख्ती से आधारित)।
गिलेस एसओ- बुराई को रोकना '

2
छँटाई और अद्वितीय पहलू काम ठीक जब पहले से LC_COLLATE=C... धन्यवाद ...
Peter.O

1
ऐसा नहीं है कि उपयोगिताओं में टकराव काम नहीं करता है, लेकिन यह है कि glibc स्थान खराब तरीके से डिज़ाइन किए गए हैं। वह व्यवहार (वर्तमान में है, लेकिन POSIX द्वारा अनुमत austingroupbugs.net/view.php?id=1070 ) देखें , लेकिन दुर्भाग्यपूर्ण और अवांछनीय है।
स्टीफन चेज़लस

6

"सुरक्षित रूप से" sortयूनिकोड स्ट्रिंग्स के लिए, शायद इस पर एक नज़र msort:

[...] Msort प्रमुख क्षेत्रों का चयन करने में अधिक लचीलापन प्रदान करता है, अधिक तुलना प्रकार, विभिन्न कुंजियों पर अलग-अलग स्थानों से टकराव के नियमों का उपयोग करने की क्षमता, गैर-पश्चिमी संख्या प्रणालियों में संख्याओं को संभालने की क्षमता, और विभिन्न विकल्पों की कमी है। GNU सॉर्ट और BSD सॉर्ट में। जबकि msort यूनिकोड, GNU सॉर्ट और BSD सॉर्ट को नहीं समझता है। [...]

http://www.billposer.org/Software/msort.html


@til: मुझे जागरूक करने के लिए धन्यवाद msort। वैकल्पिक जीयूआई प्रस्ताव पर जो कुछ भी महसूस करता है उसे प्राप्त करने के लिए परिचय को थोड़ा आसान बनाता है। उत्पन्न कमांड की प्रतिलिपि बनाने में सक्षम होना बहुत आसान है ... और हाँ, यह यूनिकोड वर्णों को क्रमबद्ध करता है, लेकिन (क्या आप केवल उन "बट्स" से प्यार नहीं करते हैं): ... लेकिन इसका कोई अनूठा विकल्प नहीं है : (... जैसा कि आपने पोस्ट किए गए लिंक पर उल्लेख किया है: Capabilities of GNU sort and BSD sort lacking in msort are the ability to merge files without sorting them (the --merge option) and the ability to emit only the first of an equal run (the --unique option)... सॉर्ट हालांकि काम करता है :)
पीटर।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.