comm: फ़ाइल क्रमबद्ध क्रम में नहीं है


9

मैं commदो सॉर्ट की गई फ़ाइलों की तुलना करता था। इन फ़ाइलों में प्रत्येक पंक्ति धनात्मक पूर्णांक संख्याएँ हैं। लेकिन परिणाम दिखाते हैं

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

इन दो फ़ाइलों को छाँटने पर भी त्रुटि कैसे आती है?


मेरे मामले में मैंने नोटपैड ++ का उपयोग करके फाइलें (लेक्सिकोग्राफिक आरोही) सॉर्ट की थी, जो छोटे केस लेटर्स और कैपिटल केस लेटर्स को अलग-अलग मानती है। a, आरोही क्रम में 'Z' के बाद दिखाई देगा। यह कैसे उपयोगिता (बैश) प्रकार से अलग है। इसे सत्यापित करने के लिए मैंने सभी पंक्तियों को ऊपरी मामले में बदल दिया, और फिर np ++ में क्रमबद्ध किया, अब कोई शिकायत नहीं की।
साहिल सिंह

जवाबों:


10

commलेक्सिकोग्राफिक सॉर्ट (सादे sort) की आवश्यकता होती है , न कि संख्यात्मक प्रकार ( sort -n) की। उदाहरण के लिए, यह निम्नलिखित आदेश चाहता है:

1
2000
300

निम्नलिखित आदेश नहीं:

1
300
2000

इसे ठीक करें और समस्या दूर होनी चाहिए। अधिक गूढ़ मामलों में जहां के लिए commके स्थान से भिन्न हो सकता sortस्थान, आप को चलाने के लिए चाहते हो सकता है sortऔर commसाथ LC_COLLATE=Cअपने वातावरण में देशी बाइट आदेश उपयोग करने के लिए।


यह कैसे संख्यात्मक तरह करते हैं?
wenzi

4
@wenzisort -n
गाइल्स '

" लेक्सोग्राफ़िक ऑर्डरिंग " वह जगह है जहाँ एक क्रमबद्ध क्रम में संख्या बढ़ जाती है- आपने इसे अपने उत्तर में पीछे कर लिया है: mathworld.wolfram.com/LexicographicOrder.html । मेरे नीचे जवाब के परीक्षण के परिणाम जो के उपयोग की तुलना करने के लिए कृपया देखें sort के साथ , और बिना-n स्विच और केवल यह दर्शाता है के साथ-n स्विच आप प्राप्त कर सकते हैं सही बढ़ती आदेश आप स्वीकार करते हैं अपने खुद के जवाब में की आवश्यकता है।
F1Linux

@ F1Linux क्या? commसचमुच LC_COLLATEडी ऑर्डर करने की आवश्यकता है । यह कहने के लिए पर्याप्त है कि आपके उत्तर में त्रुटियां आपके परीक्षण सेट के बाहर के उदाहरणों के लिए विशुद्ध रूप से कॉस्मेटिक नहीं हैं ... किसी ने सकारात्मक संख्यात्मक प्रकार के लिए नहीं पूछा।
क्रिस डाउन

आपका उत्तर @ChrisDown कि मैं हैं- जवाब नहीं एक मैं देख रहा हूँ तुम सिर्फ संपादित कर लिया है और केवल अब उल्लेख है " LC_COLLATE " था: " । कॉम literallexicographic तरह, आंकिक नहीं प्रकार चाहता है यह ठीक करें और समस्या का समाधान करना चाहिए। " अब जहां "LC_COLLATE" के बारे में कुछ भी था जो "_Lexographic" सॉर्ट की तुलना में बहुत अलग जानवर है। वास्तव में, आप प्रारंभिक उत्तर में केवल एक ही पंक्ति के साथ एक ही पंक्ति में विरल थे, जिसने मुझे अपने स्वयं के उत्तर के साथ प्रश्न पर दोबारा गौर करने के लिए प्रेरित किया। मैं आपके अपडेट किए गए उत्तर को बढ़ा रहा हूं क्योंकि "LC_COLLATE" निश्चित रूप से यहां ऑपरेटिव है जैसा आपने उल्लेख किया है।
F1Linux

0

अद्यतन उत्तर:

मुसीबत:

ओपी को फ़ाइलों में सकारात्मक पूर्णांक की तुलना करते समय " फाइल क्रमबद्ध क्रम में नहीं है " के बारे में एक त्रुटि प्राप्त हो रही है , पाठ नहीं। इसलिए हम गैर-दशमलव संख्या के साथ काम कर रहे हैं।comm

संक्षिप्त जवाब:

आपूर्ति करने के लिए उपयोग किए गए परिणामों को क्रमबद्ध करने के लिए उपयोग किए गए आदेश के -nसाथ स्विच के उपयोग के आधार पर , लौटाए गए परिणामों का क्रम बहुत अलग हो सकता है:sortcommcomm

लेक्सोग्राफिक : -nसॉर्ट के साथ स्विच का उपयोग "पॉजिटिव इंटेगर" के परिणामस्वरूप बढ़ती संख्याओं की एक श्रृंखला में किया जाएगा। " त्रुटि " commस्विच का उपयोग करके दबाया जा सकता है--nocheck-order

बाइट ऑर्डर : के साथ कोई उपयोग नहीं है । आदेश को निर्धारित करता है जो होस्ट द्वारा सेट किए गए आदेश पर कैसे लागू होता है, इसके अनुसार भी भिन्न हो सकता है। यह इनपुट डिफ़ॉल्ट रूप से अपेक्षित है। इसके बारे में थोड़ा और यहाँ पाया जा सकता है: Reference1 और Reference2-n switchsortLC_COLLATElocalecommLC_COLLATE

क्या त्रुटि एक समस्या है? यह इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। जैसा कि आप नीचे दिए गए उदाहरणों में देखेंगे,commफ़ाइलों को 's'स्विच के साथ या उसके बिना तुलना करने के बाद समान परिणाम देता है, भले ही उनका ऑर्डर ऊपर दिए गए तरीके के आधार पर अलग-अलग होगा, चाहेवहकमांड केसाथ प्रयोग किया गया हो। स्वयं, मैं "लेक्सोग्राफ़िक" के लिए आदेश दिए गए परिणाम- संख्याएँ जो एक श्रृंखला में बढ़ती हैं।sort-n-n switchsort

हालाँकि यदि आप " lexographic " क्रम में परिणाम नहीं चाहते हैं , तो तुलना के लिए आपूर्ति किए गए डेटा को सॉर्ट करते समय स्विच का उपयोग करें ।-ncomm

परिक्षण:

हम स्विच के commसाथ और बिना कमांड के परिणामों की तुलना करेंगे -n। मैंने कुसलानंद के अनुरोध के अनुसार अपने नमूना परीक्षण डेटा सेट की जटिलता बढ़ाई है:

टेस्ट डेटा :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

प्रतिच्छेदन :

BOTH फ़ाइलों के लिए केवल सामान्य संख्याओं की सूची बनाएं

-nस्विच के बिना :

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

परिणाम : सही, लेकिन संयुक्त राष्ट्र के आदेश में वापस आ गया

-nस्विच के साथ :

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

परिणाम : सही है, लेकिन एक LEXOGRAPHIC क्रमबद्ध क्रम में वापस आ गया । ऑपरेशन सफलतापूर्वक पूरा हुआ और स्विच के commबिना उपयोग के समान परिणाम लौटाए -n, लेकिन क्रमबद्ध सूची में।

अंतर :

प्रत्येक फ़ाइल के लिए केवल अद्वितीय संख्याएँ सूचीबद्ध करें:

-nस्विच के बिना :

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

परिणाम : सही- ये नंबर वास्तव में प्रत्येक संबंधित फ़ाइल के लिए अनन्य हैं।

-nस्विच के साथ :

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

परिणाम : सही, स्विच के commबिना ही परिणाम -n, लेकिन सकारात्मक पूर्णांकों के क्रम के बारे में त्रुटि को स्वयं फ़ाइलों में क्रमबद्ध नहीं किया जा रहा है।

LEXOGRAPHIC परिणामों के लिए समाधान:

त्रुटि संदेश को दबाने के लिए comm`s --nocheck-orderस्विच का उपयोग करें । चूँकि हम जानते हैं कि संख्याएँ प्रत्येक फ़ाइल में क्रमबद्ध नहीं हैं, लेकिन इसके द्वारा लौटाए गए परिणाम comm -nसही हैं, त्रुटि को इसे दबाकर सुरक्षित रूप से अनदेखा किया जा सकता है:

प्रतिच्छेदन :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

अंतर :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

निष्कर्ष:

त्रुटि " फ़ाइल सॉर्ट किए गए क्रम में नहीं है " जब सकारात्मक सॉर्टर्स को खिलाया जाता commहै, तो इसका मतलब यह नहीं है कि -nस्विच का उपयोग करके लौटाए गए परिणाम commगलत हैं। वास्तव में, comm -nक्रमबद्ध क्रम में एक सही तरीके से रिटर्न का उपयोग करना!

@Dhag, @kusalananda @ChrisDown को उन मुद्दों को उठाने के लिए धन्यवाद, जिन्हें और विस्तार की आवश्यकता थी। हमेशा मेरे काम की समीक्षा करने में खुशी होती है: हम बेहतर हो सकते हैं, केवल एक ही तरीका है अगर हम लगातार अपने साथियों द्वारा धकेल दिए जाते हैं और चुनौती देते हैं।


शीर्ष-वोट किए गए उत्तर में उल्लेख किया गया है कि "कॉम लेक्सिकोग्राफिक सॉर्ट चाहता है", फिर भी आप संख्यात्मक रूप से सॉर्ट करते हैं। ऐसा लग रहा है कि यह कुछ मामलों में गिर जाएगा।
ढग

संख्या उस तरह अलग ढंग से संख्यानुसार और कोषगत के साथ फिर से टेस्ट, जैसे 1000, 200, 30, 4
Kusalananda

@ कुसलानंद ने मेरे अद्यतन उत्तर में अपनी बहुत ही दयालु और उपयोगी प्रतिक्रिया को शामिल किया। आपकी प्रतिक्रिया के लिए सबसे अधिक बाध्य!
F1Linux

@dhag ने सिर्फ तुम्हारा और कुसलनाडा की प्रतिक्रिया को शामिल करने के लिए मेरे उत्तर को अपडेट किया। मेरे जवाब की समीक्षा के लिए समय और प्रयास लेने वाले आप लोगों के लिए सबसे अधिक बाध्य है
F1Linux

1
@JeffSchaller उत्तर मैंने शुरू में "लेक्सोग्राफ़िक" सॉर्ट का उल्लेख किया था, न कि "LC_COLLATE" जैसा क्रिस के नए संशोधित उत्तर में। मैंने क्रिस को जवाब दिया जो सही है और उसके अद्यतन उत्तर को उखाड़ फेंका। "लेक्सोग्राफ़िक" और "LC_COLLATE" अलग-अलग जानवर हैं। धन्यवाद
जेफ-
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.