2009-07-26 27 views
13

के यूनिक्स सॉर्ट उपचार में मेरे पास दो लिनक्स मशीन हैं, जिस पर यूनिक्स सॉर्ट अलग-अलग व्यवहार करता है। मेरा मानना ​​है कि मैंने अंडरस्कोर चरित्र के इलाज के लिए इसे कम कर दिया है।अंडरस्कोर वर्ण

अगर मैं sort tmp, जहां tmp निम्नांकित दो पंक्तियों को शामिल चलाएँ:

aa_d_hh 
aa_dh_ey 

एक मशीन आउटपुट

aa_d_hh 
aa_dh_ey 

(यानी '_' पछाड़ 'h'), जबकि अन्य आउटपुट

aa_dh_ey 
aa_d_hh 

(यानी 'h' से पहले आती है '_')। मुझे इन मशीनों को एक साथ व्यवहार करने की आवश्यकता है (जैसा कि मैं बाद में सॉर्ट-एम का उपयोग करता हूं, बहुत बड़ी फ़ाइलों को मर्ज करने के लिए)।

वहाँ किसी भी तरह से मैं एक ही रास्ता या अन्य में व्यवहार करने के लिए मजबूर कर सकते हैं प्रकार है?

धन्यवाद।

+0

दोनों मशीनों पर क्रमबद्ध प्रयास करें .. वे वही हैं ?? – sud03r

उत्तर

15

आप LC_COLLATE पारंपरिक सॉर्ट क्रम को सिर्फ अपने आदेश के लिए सेट कर सकते हैं: सिर्फ एक

env LC_COLLATE=C sort tmp 

यह वर्तमान वातावरण में परिवर्तन नहीं होगा जिसमें सॉर्ट कमांड निष्पादित करता है। आपको इसके साथ एक ही व्यवहार होना चाहिए।

+0

LC_COLLATE के कुछ अन्य मान्य विकल्प क्या हैं? मान लीजिए कि मैं विशेष रूप से अंडरस्कोर नीचे ले जाना चाहता हूं? वह मूल्य क्या करेगा? –

+0

'LC_COLLATE = en_US.ASCII' एक और वैध विकल्प है, जिसमें अंडरस्कोर के लिए 'सी'' के समान क्रम क्रम है। –

3

सॉर्ट क्रम वातावरण चर नियंत्रण रेखा _ मुक़ाबला के वर्तमान मूल्य पर निर्भर करता है। 'लोकेल', 'सेटलोकेल' इत्यादि के लिए अपने स्थानीय दस्तावेज की जांच करें। एलसी _ को दोनों मशीनों पर 'पॉज़िक्स' में कॉललेट सेट करें, और परिणाम मिलना चाहिए।

+0

मेरी मशीन पर ऐसा कोई पर्यावरण चर नहीं है, फिर भी सॉर्ट ठीक काम करता है। – sud03r

0

अंतर अपने locale के कारण है। वर्तमान सेटिंग्स की जांच के लिए locale कमांड का उपयोग करें।

LC_COLLATE, LC_TIME, और LC_MESSAGES जैसी कई अलग-अलग लोकेल श्रेणियां हैं। आप पर्यावरण चर को पर्यावरण परिवर्तनीय LC_COLLATE सेट करके पर्यावरण चर LC_ALL या LANG, या केवल कॉलेशन (सॉर्ट) ऑर्डर सेट करके उन्हें बदल सकते हैं। लोकेल C या POSIX मानक द्वारा परिभाषित एक मूल लोकेल है; दूसरों en_US (अमेरिका अंग्रेजी), fr_FR (फ्रांस), आदि शामिल हैं

0

यह संभावना स्थान में एक अंतर के कारण होता है। en_US.UTF-8 स्थान में, रेखांकित (_) अक्षर और संख्या के बाद प्रकार जबकि POSIX C locale में वे प्रकार बड़े अक्षरों और संख्याओं के बाद, लेकिन से पहले लोअरकेस संख्या।

# won't change LC_COLLATE=C after execution 
$ LC_COLLATE=C sort filename 

तुम भी sort --debug उपयोग कर सकते हैं सामान्य रूप में छँटाई व्यवहार के बारे में अधिक जानकारी दिखाने के:

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=en_US.UTF-8 sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
foo0bar 
fooabar 
fooAbar 
foo_bar 

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=C sort --debug 
sort: using simple byte comparison 
foo0bar 
fooAbar 
foo_bar 
fooabar 

के रूप में भी this answer में दिखाया गया है, आप एक ही आदेश के लिए LC_COLLATE=C मजबूर करने के लिए ऊपर सूत्र का उपयोग कर सकते हैं, अपने खोल पर्यावरण को संशोधित किए बिना:

संबंधित मुद्दे