एक ही कुंजी के आधार पर छाँटने के लिए GNU सॉर्ट का उपयोग करें / अन्य कुंजियों की अवांछित छँटाई को रोकें


9

मेरे पास एक फाइल है जिसमें पहले से ही डेटा का ऑर्डर दिया गया है और मैं दूसरी कुंजी में डेटा के क्रम को नष्ट किए बिना एक कुंजी में मान के अनुसार फाइल को फिर से ऑर्डर करना चाहता हूं।

जिन जीयूयू सॉर्ट को मैंने निर्दिष्ट नहीं किया है, उनके मानों के आधार पर पंक्ति छँटाई करने से जीएनयू सॉर्ट को कैसे रोका जा सकता है, या जीएनयू सॉर्ट को निर्दिष्ट करते समय किस प्रकार की कुंजियों को अनदेखा करना है?

फ़ाइल data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

अपेक्षित उत्पादन:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

कमान:

sort -k 1,1 <data.txt

परिणाम: अवांछित छँटाई मैंने नहीं माँगी:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

जवाबों:


21

आपको एक स्थिर प्रकार की आवश्यकता है । से man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

अर्थात .:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

ध्यान दें कि आप भी शायद चाहते हैं -nया --numeric-sortयदि आपकी कुंजी संख्यात्मक है (उदाहरण के लिए, आपको डिफ़ॉल्ट - लेक्सिकल - सॉर्ट ऑर्डर के साथ 10 से 2 की तुलना करते हुए अप्रत्याशित परिणाम मिल सकते हैं)। किस मामले में यह करने की बात है:

sort -sn <data.txt

पहली फ़ील्ड निकालने की कोई आवश्यकता नहीं है क्योंकि पूरी लाइन की संख्यात्मक व्याख्या पहले फ़ील्ड के समान होगी।



मैंने डॉक्स पढ़ा लेकिन "स्थिर" की उचित परिभाषा ने मेरा ध्यान आकर्षित किया। त्वरित, संक्षिप्त और अच्छी तरह से उद्धृत प्रतिक्रिया के लिए धन्यवाद। वास्तविक डेटा की पहली कुंजी स्थानीयकृत स्ट्रिंग है, इसलिए संख्यात्मक मेरे लिए काम नहीं करेगा।
Wil

4

(गैर-जीएनयू) sortकार्यान्वयन के लिए जो एक -sविकल्प की कमी है , आप हमेशा ऐसा कर सकते हैं:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

यही है, इसे दूसरी तरह की कुंजी बनाने के लिए लाइन नंबर को प्रीपेंड करें, और बाद में पट्टी करें।

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