पहले कॉलम के अवरोही क्रम में डेटा को क्रमबद्ध करें, समान मूल्यों के लिए, आरोही क्रम में दूसरे कॉलम का उपयोग करें


22

मुझे स्पष्ट करने की अनुमति दें:

मान लें कि उनके उपयोग की आवृत्ति के साथ मेरे कुछ खोजशब्द हैं:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

मुझे क्या चाहिए, इस डेटा को अवरोही क्रम में आवृत्ति के आधार पर सॉर्ट करना है और यदि कुछ समान मूल्य हैं, तो आरोही क्रम में दूसरे कॉलम का उपयोग करना चाहिए।

sort -n -r foo.txt

क्या पहला भाग लेकिन फिर दूसरा स्तंभ भी हैं reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

मैं निम्नलिखित परिणाम कैसे प्राप्त कर सकता हूं?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

मुझे लगता है कि मुझे -kतर्क का उपयोग करना है लेकिन मैं यह पता नहीं लगा सकता कि कैसे!

मैं जानना चाहता हूं कि यह पूरी तरह से sortकमांड का उपयोग करके कैसे किया जा सकता है bash। हालाँकि यदि यह केवल इसे प्राप्त करना संभव नहीं है sort, तो अन्य कमांड बॉर्न शेल संगत होना चाहिए।


[कुछ हद तक ओटी]: हालांकि संख्यात्मक तुलना के -gबजाय GNU- सॉर्ट (सामान्य संख्यात्मक) विकल्प का उपयोग करते हुए इस विशेष-डेटा के लिए बराबर -nसुरक्षित है: यह फ्लोटिंग पॉइंट और पूर्णांक दोनों के लिए सही ढंग से काम करता है।
20

जवाबों:


32

मापदंड के साथ सॉर्ट कुंजी को अलग से निर्दिष्ट करें:

sort -k1,1nr -k2,2 inputfile

यह निर्दिष्ट करता है कि पहली कुंजी को संख्यात्मक रूप से रिवर्स ऑर्डर में क्रमबद्ध किया गया है जबकि दूसरी को डिफ़ॉल्ट के अनुसार क्रमबद्ध किया गया है क्रम के ।

POSIX प्रकार से उद्धरण :

-k keydef

Keydef तर्क एक प्रतिबंधित तरह कुंजी क्षेत्र परिभाषा है। इस परिभाषा का प्रारूप है:

field_start [ प्रकार ] [ , field_end [ प्रकार ]]

जहाँ फ़ील्ड_स्टार्ट और फ़ील्ड_एंड लाइन के एक हिस्से तक सीमित एक महत्वपूर्ण क्षेत्र को परिभाषित करते हैं (अतिरिक्त विवरण अनुभाग देखें), और प्रकार 'बी', 'डी', 'एफ', 'आई', 'वर्णों की सूची से एक संशोधक है' n ',' r '। 'बी' संशोधक -bविकल्प की तरह व्यवहार करेगा , लेकिन केवल फ़ील्ड_स्टार्ट या फ़ील्ड_ेंड पर लागू होगा, जिसमें वह संलग्न है। अन्य संशोधक संबंधित विकल्पों की तरह व्यवहार करेंगे, लेकिन वे केवल उस मुख्य क्षेत्र पर लागू होंगे, जहाँ वे संलग्न हैं; फ़ील्ड_स्टार्ट , फ़ील्ड_एंड या दोनों के साथ निर्दिष्ट होने पर उनका यह प्रभाव होगा ।, कोई भी विकल्प लागू नहीं होगा। कार्यान्वयन -kविकल्प के कम से कम नौ घटनाओं का समर्थन करेगा , जो कमांड लाइन क्रम में महत्वपूर्ण होगा। यदि कोई -kविकल्प निर्दिष्ट नहीं किया जाता है, तो संपूर्ण पंक्ति की डिफ़ॉल्ट सॉर्ट कुंजी का उपयोग किया जाएगा।

जब कई महत्वपूर्ण फ़ील्ड होते हैं, तो बाद की कुंजियों की तुलना सभी पूर्व की कुंजियों के बराबर होने के बाद ही की जाएगी। को छोड़कर जब -uविकल्प निर्दिष्ट, लाइनों है कि अन्यथा बराबर की तुलना के रूप में यदि आदेश दिया की जाएगी विकल्पों में से कोई भी -d, -f, -i, -n, या -kथे वर्तमान (लेकिन साथ -r अभी भी लागू है, यह निर्दिष्ट किया गया था) और लाइनों के लिए महत्वपूर्ण में सभी बाइट्स के साथ तुलना। जिस क्रम में लाइनें अभी भी बराबर की तुलना में लिखी जाती हैं वह अनिर्दिष्ट है।

यह उत्पादन होगा:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

धन्यवाद। की चाल चली। स्वीकार करने के लिए 10 मिनट इंतजार करना होगा!
पूय

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