ग्नू सॉर्ट में - वेजाइनल-न्यूमेरिक-सॉर्ट और - न्यूमरिक-सॉर्ट विकल्पों में क्या अंतर है


113

sortदो प्रकार के संख्यात्मक प्रकार प्रदान करता है। यह मैन पेज से है:

   -g, --general-numeric-sort
          compare according to general numerical value

   -n, --numeric-sort
          compare according to string numerical value

क्या फर्क पड़ता है?


17
ध्यान दें कि पूर्ण दस्तावेज़ पृष्ठ sortनहीं है, manलेकिन infoपृष्ठ ( info sort) है।
a3nm

जवाबों:


85

सामान्य संख्यात्मक प्रकार फ़्लोट्स के रूप में संख्याओं की तुलना करता है, यह वैज्ञानिक संकेतन की अनुमति देता है जैसे 1.234E10 लेकिन धीमी है और गोलाई त्रुटि के अधीन है (1.2345678 1.2345679 के बाद आ सकता है), संख्यात्मक क्रमांक केवल एक नियमित रूप से वर्णनात्मक है जो जानता है कि 9 के बाद 10 आता है।

Http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html देखें

'-ग' '- -गर्नल-न्यूमेरिक-सॉर्ट' '- एसोर्ट = जनरल-न्यूमेरिक' क्रमबद्ध रूप से, प्रत्येक लाइन के एक उपसर्ग को डबल-प्रिसिजन फ़्लोटिंग पॉइंट संख्या में बदलने के लिए मानक C फ़ंक्शन स्ट्रटोड का उपयोग करते हुए। यह अस्थायी बिंदु संख्या को वैज्ञानिक संकेतन में निर्दिष्ट करने की अनुमति देता है, जैसे 1.0e-34 और 10e100। LC_NUMERIC स्थान दशमलव-बिंदु वर्ण निर्धारित करता है। ओवरफ़्लो, अंडरफ़्लो या रूपांतरण त्रुटियों की रिपोर्ट न करें। निम्नलिखित कोलाजिंग अनुक्रम का उपयोग करें: वे रेखाएँ जो संख्याओं से शुरू नहीं होती हैं (सभी को समान माना जाता है)। एक सुसंगत लेकिन मशीन पर निर्भर क्रम में NaNs ("आईईईई फ्लोटिंग पॉइंट अंकगणित में" नंबर नहीं)। माइनस इनफिनिटी। आरोही संख्यात्मक क्रम में परिमित संख्या (-0 और +0 बराबर)। साथ ही अनंत।

इस विकल्प का उपयोग केवल तभी करें जब कोई विकल्प न हो; यह --numeric- सॉर्ट (-n) की तुलना में बहुत धीमा है और यह फ़्लोटिंग पॉइंट में परिवर्तित होने पर जानकारी खो सकता है।

'-n' '--numeric-sort' '--sort = numerically क्रमबद्ध करें। संख्या प्रत्येक पंक्ति से शुरू होती है और इसमें वैकल्पिक रिक्त स्थान होते हैं, एक वैकल्पिक '-' चिह्न, और शून्य या अधिक अंक संभवतः हजारों विभाजकों द्वारा अलग किए जाते हैं, वैकल्पिक रूप से एक दशमलव-बिंदु चरित्र और शून्य या अधिक अंकों के बाद। एक खाली संख्या को '0' के रूप में माना जाता है। LC_NUMERIC स्थान दशमलव-बिंदु वर्ण और हजारों विभाजक को निर्दिष्ट करता है। डिफ़ॉल्ट रूप से एक रिक्त स्थान या टैब है, लेकिन LC_CTYPE स्थान इसे बदल सकते हैं।

तुलना सटीक है; कोई गोल त्रुटि नहीं है।

न तो एक अग्रणी '+' और न ही घातीय संकेतन मान्यता प्राप्त है। संख्यात्मक रूप से इस तरह के तारों की तुलना करने के लिए, --general-संख्यात्मक-सॉर्ट (-g) विकल्प का उपयोग करें।


2
धन्यवाद। अजीब बात है कि आदमी और जानकारी पृष्ठों में यह नहीं है। मुझे gnu.org/software/coreutils/manual/html_node/index.html के बारे में भी नहीं पता था ।
ट्रेंटन

6
यह सामान मेरे लिए काम नहीं कर रहा है। मैं R1 R2 R10 R15 जैसी सामग्री के साथ एक तीसरे स्तंभ के साथ एक फ़ाइल को सॉर्ट कर रहा हूं। -k3.2nया तो का उपयोग करना -k3.2g, यह R10पहले छँटाई है R2। सॉर्ट लेक्सिकोग्राफ़िक है, न कि संख्यात्मक। मुझे उम्मीद है कि यह दूसरे चरित्र से एक नंबर के रूप में क्षेत्र का इलाज करेगा।
कज़

6
@ काज: sortप्रमुख चश्मा। वास्तव में बीजान्टिन हैं - इसका छोटा हिस्सा है: क्षेत्र से पहले खाली (ओं) को क्षेत्र का हिस्सा माना जाता है , इसलिए चार। सूचकांक (1) क्षेत्र के पूर्ववर्ती अंक को इंगित करता है, न कि क्षेत्र का वास्तविक पहला चार्ट। प्रत्यय चार। bइस समस्या को ठीक करने के लिए सूचकांक , यानी: -k 3.2bn,3(ध्यान दें कि वैश्विक -b विकल्प इस मामले में काम नहीं करता है )। जोड़ा गया पर भी ध्यान दें ,3, जो यह सुनिश्चित करता है कि केवल 3rd फ़ील्ड का उपयोग किया जाता है - उस 2nd फ़ील्ड इंडेक्स के बिना, पूरी पंक्ति के शेष का उपयोग किया जाता है।
mklement0

11

आपको अपने लोकेल से सावधान रहना चाहिए। उदाहरण के लिए, आप एक फ्लोटिंग नंबर (जैसे 2.2) को छाँटने का इरादा कर सकते हैं, जबकि आपका लोकेल अल्पविराम (जैसे 2) के उपयोग की उम्मीद कर सकता है।

जैसा कि इस फ़ोरम में बताया गया है , आपके पास -n या -g झंडे का उपयोग करने के गलत परिणाम हो सकते हैं।

मेरे मामले में मैं उपयोग करता हूं:

LC_ALL=C sort -k 6,6n file

6 वें कॉलम को छाँटने के लिए जिसमें निम्न शामिल हैं:

2.5
3.7
1.4

प्राप्त करने हेतू

1.4
2.5
3.7

2
लैंग = सी के साथ भी, मैं -nकॉमा को एक हजारों विभाजक के रूप में नहीं पहचान सकता - "1,000" को "1" के समान माना जाता है।
स्कॉट

1
वह LC_ALL = C होना चाहिए।
स्टुअर्ट पी। बेंटले

@ संकेत: वास्तव में, हजारों विभाजकों को मान्यता नहीं दी जाती है: सबसे लंबे समय तक उपसर्ग तर्क sortका उपयोग करता है: पंक्ति / कुंजी का सबसे लंबा हिस्सा यह पहचानता है कि एक संख्या का उपयोग किया जाता है; एक ऐसे लोकेल में, जो मूलांक वर्ण के रूप में उपयोग होता है , यह पढ़ना बंद कर देगा । .,
mklement0

@ StuartP.Bentley: LC_ALL=Cवास्तव में सबसे मजबूत विकल्प है; हालाँकि, अगर LC_ALLसेट नहीं होता है , तो LANG=Cभी काम करेगा।
mklement0

1
अच्छी बात है, लेकिन LANG=C sort -k 6,6n fileदोनों सरल है और पर्यावरण कमांड को विशिष्ट कमांड पर सेट करने के प्रभाव को भी स्थानीयLANG करता है।
mklement0

0

स्वीकृत उत्तर के अलावा जो उल्लेख -gवैज्ञानिक संकेतन की अनुमति देता है , मैं उस हिस्से को दिखाना चाहता हूं जो सबसे अधिक अवांछनीय व्यवहार का कारण बनता है।

के साथ -g:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -g myfile
baa
--inf
--inf  
--inf- 
--inf--
--inf-a
--nnf
nnf--
   nnn  
tnan
zoo
   naN
Nana
nani lol
-inf
-inf--
-11
-2
-1
1
+1
2
+2
0xa
11
+11
inf

यहां देखें zoo, तीन महत्वपूर्ण बातें:

  • रेखा शुरू होती है NAN(जैसे Nanaऔर nani lol) या -INF(एकल डैश, नहीं --INF) अंत करने के लिए कदम लेकिन अंकों से पहले। जबकि INFअंकों के बाद अंतिम पर जाएं क्योंकि इसका अर्थ है अनंत

  • NAN, INF, और -INFकर रहे हैं केस संवेदी

  • लाइनों हमेशा के दोनों ओर से खाली स्थान के उपेक्षा NAN, INF, -INF (भले ही LC_CTYPE)। अन्य वर्णमाला या तो व्हाट्सएप को नजरअंदाज कर सकते हैं, लोकेल पर निर्भर करता है LC_COLLATE(जैसे LC_COLLATE=fr_FR.UTF-8अनदेखा करें लेकिन LC_COLLATE=us_EN.UTF-8अनदेखा न करें)।

इसलिए यदि आप मनमाना अल्फ़ान्यूमेरिक छाँट रहे हैं, तो आप शायद नहीं चाहते हैं -g। यदि आपको वास्तव में वैज्ञानिक संकेतन तुलना की आवश्यकता है -g, तो आप संभवतः वर्णमाला और संख्यात्मक डेटा निकालना चाहते हैं और तुलना अलग से करते हैं

यदि आपको केवल साधारण संख्या (जैसे 1, -1) छंटनी की आवश्यकता है, और महसूस करें कि 0x/E/+ sortingमहत्वपूर्ण नहीं है, तो बस -nपर्याप्त उपयोग करें :

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-1000
-22
-13
-11
-010
-10
-5
-2
-1
-0.2
-0.12
-0.11
-0.1
0x1
0x11
0xb
+1
+11
+2
-a
-aa
--aa
-aaa
-b
baa
BAA
bbb
+ignore
inf
-inf
--inf
--inf  
--inf- 
--inf--
-inf--
--inf-a
   naN
Nana
nani lol
--nnf
nnf--
   nnn  
None         
uum
Zero cool
-zzz
1
1.1
1.234E10
5
11

या तो, -gया स्थानीय प्रभाव से-n अवगत रहें । आप यह निर्दिष्ट कर सकते हैं LC_NUMERICके रूप में us_EN.UTF-8 fr_FR.UTF-8 प्रकार से बचने के लिए -चल संख्या में विफल रहा है के साथ :

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=fr_FR.UTF-8 sort -n myfile
-10
-5
-2
-1
-1.1
-1.2
-0.1
-0.11
-0.12
-0.2
-a
+b
middle
-wwe
+zoo
1
1.1

के साथ LC_NUMERIC=en_US.UTF-8:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-10
-5
-2
-1.2
-1.1
-1
-0.2
-0.12
-0.11
-0.1
-a
+b
middle
-wwe
+zoo
1
1.1

या LC_NUMERIC=us_EN.UTF-8के +|-|spaceसाथ समूह के लिए alpha:

$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=us_EN.UTF-8 sort -n myfile
-0.1
    a
    b
 a
 b
+b
+zoo
-a
-wwe
middle
1

यदि आप पोर्टेबल स्क्रिप्ट लिखना चाहते हैं, तो संभवतः आप इसका localeउपयोग sortकरना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.