LC_COLLATE के साथ सॉर्ट क्रम निर्दिष्ट करें ताकि अपरकेस से पहले लोअरकेस हो


16

फ़ाइल दी:

$ cat file
1
a
C
B
2
c
3
A
b

डिफ़ॉल्ट रूप से sortहोगा:

$ sort file
1
2
3
a
A
b
B
c
C

साथ LC_COLLATE=Cइतने छोटे अक्षरों से पहले अपरकेस अक्षर में क्रमबद्ध करेगा:

$ LC_COLLATE=C sort file
1
2
3
A
B
C
a
b
c

क्या मामले के आदेश को उलटना संभव है, यह अंक, लोअरकेस और फिर अपरकेस है?

जवाबों:


8

मुझे ऐसे किसी भी स्थान का पता नहीं है, जो डिफ़ॉल्ट रूप से, उस क्रम में क्रमबद्ध हो। समाधान एक कस्टम प्रकार को कस्टमाइज़्ड क्रम के साथ बनाना है। यदि कोई चार साल बाद, एक कस्टम फैशन में सॉर्ट करना चाहता है, तो यहां चाल है।

अधिकांश विशाल स्थान अपने स्वयं के क्रम को निर्दिष्ट नहीं करते हैं, बल्कि उस क्रम में परिभाषित क्रम को कॉपी करते हैं /usr/share/i18n/locales/iso14651_t1_common, जिसे आप संपादित करना चाहते हैं। मूल को संशोधित करके लगभग हर स्थान के लिए क्रम क्रम बदलने के बजाय iso14651_t1_common, मैं आपको एक प्रतिलिपि बनाने का सुझाव देता हूं। क्रमबद्ध तरीके से कैसे काम करता है और $HOMEरूट एक्सेस के बिना आपकी निर्देशिका में एक कस्टम लोकेल कैसे बनाया जाता है, इस बारे में विवरण इसी तरह के प्रश्न के उत्तर में मिलता है

इनकी प्रविष्टियों के आधार पर कैसे aऔर Aक्या आदेश दिए गए हैं , इस पर एक नज़र डालें iso14651_t1_common:

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

bऔर Bसमान हैं:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

हम पहले पास पर देखते हैं कि, दोनों aऔर Aक्रमवार प्रतीक है <a>, जबकि दोनों bऔर Bक्रमवार प्रतीक है <b>। चूंकि <a>पहले <b>में दिखाई देता है iso14651_t1_common, aऔर Aपहले से बंधा हुआ है bऔर B। दूसरा पास संबंधों को नहीं तोड़ता है क्योंकि सभी चार वर्णों का कोलाजिंग सिंबल है <BAS>, लेकिन तीसरे पास के दौरान संबंधों को हल किया जाता है क्योंकि <MIN>अपरकेस अक्षरों के लिए कोलाजिंग सिंबल अपरकेस अक्षर <CAP>(लाइन 3488) के लिए कोलेटिंग सिंबल से पहले लाइन 3467 पर दिखाई देता है। । तो सॉर्ट क्रम के रूप में समाप्त होता है a, A, b, B

पहले और तीसरे कोलाजिंग प्रतीकों की अदला-बदली पहले अक्षर केस (लोअर अपर) से होती है, फिर एक्सेंट ( <BAS>मतलब नॉन-एक्सेंट) से, फिर अल्फाबेटिकल ऑर्डर से। हालांकि , दोनों <MIN>और <CAP>अंकों की पहले आते हैं, तो यह पत्र के बाद अंक डालने की अवांछित प्रभाव होगा।

सभी निचले अक्षरों को बनाने से पहले अंकों को रखने का सबसे आसान तरीका सभी अपरकेस अक्षरों से पहले आता है, सभी पत्रों को पहले तुलना के दौरान उन्हें सभी के बराबर सेट करके टाई करने के लिए मजबूर करना है <a>। यह सुनिश्चित करने के लिए कि वे मामले के भीतर वर्णानुक्रम में सॉर्ट करते हैं, अंतिम कोलाज़िंग प्रतीक IGNOREको वर्तमान से पहले कोलाज़िंग प्रतीक में बदल दें। इस पैटर्न के बाद, aबन जाएगा:

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A बन जाएगा:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b बन जाएगा:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B बन जाएगा:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

और बाकी पत्रों के लिए।

एक बार जब आप एक अनुकूलित संस्करण बना लेते हैं, तो अपने कस्टम लोकेल को संकलित करने के लिए ऊपर दिए गए उत्तरiso14651_t1_common में दिए गए निर्देशों का पालन करें ।


6

LC_COLLATE=Cलोअरकेस से पहले अपरकेस को सेट करना हमेशा पर्याप्त नहीं होता है। आपको सेट करने की आवश्यकता हो सकती है LC_ALL=C

यह गैर-अल्फ़ान्यूमेरिक और यहां तक ​​कि गैर-प्रिंट करने योग्य वर्णों को भी ध्यान में रखेगा, लेकिन यदि आप नहीं चाहते हैं कि विकल्प हैं -dऔर -i(वर्णित man sort) तो बंद हो जाएंगे।

यह शायद मल्टीबीट इनपुट के साथ बुरी तरह से विफल हो जाएगा, जैसे कि गैर-एएससीआईआई अक्षरों के साथ यूटीएफ -8।

अपरकेस (क्रम में) से पहले लोअरकेस (क्रम में) प्राप्त करने के लिए, सबसे अच्छा तरीका है कि मैं सोच सकता हूं कि एक पूर्ण प्रोग्रामिंग भाषा को तोड़ना शामिल नहीं है, सभी अक्षरों के मामले को सॉर्ट करने से पहले और इनवर्ट करने से पीछे हटना है। बाद में।

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

2

मैं कोई विशेषज्ञ नहीं हूँ, लेकिन मैंने कभी ऐसा लोकेल नहीं देखा जो इस तरह से टकराव को परिभाषित करता हो। AFAIK यह कोलाज केवल C में है जहां यह ASCII मूल्यों पर आधारित है । (आम तौर पर मैं इसे केवल एक स्क्रिप्ट द्वारा हल करूंगा।)

हालाँकि, मैंने ऐसा कभी नहीं किया है, लेकिन आप स्थानीयकरण (1) और लोकेल (5) को देखना चाहते हैं कि लोकेशन कैसे परिभाषित की जाती है और आखिरकार आप अपने खुद को कैसे परिभाषित करते हैं।

यह भी मत भूलो कि यदि कोई विशेषक या विशेष वर्ण हैं, तो सी लोकेल उन्हें इलाज नहीं करेगा जैसा आप चाहते हैं। उदाहरण के लिए, यह áपास aया Łपास नहीं रखा जाएगा L। ऐसे मामलों में, भाषा का मूल स्थान शायद एक बेहतर शुरुआती बिंदु होगा।


0

मेरा मानना ​​है कि जवाब की आवश्यकता के बिना LC_COLLATE बदल गया है (जिसका अर्थ है फ़ंक्शन को डिफ़ॉल्ट व्यवहार के रूप में छोड़ना):

सॉर्ट -f फ़ाइल

यह लिनक्स पर काम करता है; यदि आप यूनिक्स पर हैं और भिन्न संस्करण चला रहे हैं तो कृपया कमांड के लिए अपने सहायता अनुभाग का संदर्भ लें। -f को मामले की अनदेखी के रूप में परिभाषित किया गया है।

बल्कि (और अजीब तरह से) जल्दी ठीक करने के लिए धन्यवाद और गलत व्याकरण, स्टीफन राउच को संपादित करें।


-1
LC_COLLATE="en_US.UTF-8" sort file

यह अपरकेस से पहले लोअरकेस को सॉर्ट नहीं करता है? ideone.com/Gtyg4Z
iiSeymour

हम्म, मेरे मामले में, इसने आपके उदाहरण का उपयोग किया।
unxnut

4
@unxnut यह गलत है। अर्धविराम के बिना, कमांड पर्यावरण के लिए सेट होगा sort, लेकिन अर्धविराम के साथ चर शेल के लिए स्थानीय है और इसके व्यवहार को प्रभावित नहीं करता है sort। अर्धविराम रखा जा सकता है जैसे कि चर भी निर्यात किया जाता है, लेकिन यह अन्य आदेशों को भी प्रभावित करेगा।
एंडर्स स्ज़ोकविस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.