केवल एक कॉलम को छाँटें, शेष कॉलमों को अछूता रखते हुए


5

अन्य स्तंभों को प्रभावित किए बिना (संख्यात्मक रूप से) एक विशिष्ट कॉलम को किसी पाठ स्तंभ में कैसे सॉर्ट किया जाता है (भले ही वे सॉर्ट किए गए हों या अनसोल्ड हों)? अन्य थ्रेड्स पर मुझे -sतर्क मिला , लेकिन यह अन्य स्तंभों को क्रमबद्ध करता है।

अवलोकन

$ cat tmp.txt
1 1
2 3
5 4
1 3

$ sort -s -n -k1,1 tmp.txt
1 1
1 3
2 3
5 4

नहीं, -sतात्पर्य स्थिर प्रकार से है। आपको अपना अवलोकन दिखाने की आवश्यकता है।
devnull

आउटपुट में क्या गलत है? आपने क्या उम्मीद किया?
devnull

@ देवनबुल दूसरा कॉलम वैसा ही रहना चाहिए जैसा वह है।
user13107

अपनी नमूना फ़ाइल की पहली और अंतिम पंक्तियों को इंटरचेंज करें और समान कमांड चलाएं। आप आंकड़ा करेंगे।
devnull

दूसरा कॉलम क्यों रहेगा? sortक्रमबद्ध करता इनपुट की तर्ज मानदंड है कि उपलब्ध कराने के आधार पर।
devnull

जवाबों:


5

जैसा कि टिप्पणियों में उल्लेख किया गया है, आप sortअकेले जो उपयोग करना चाहते हैं उसे प्राप्त नहीं कर सकते ।

आप cutइनपुट फ़ाइल को sort, और pasteउन लोगों को प्रासंगिक हिस्सा खिला सकते हैं।

$ paste -d' ' <(cut -d' ' -f1 input | sort -n) <(cut -d' ' -f2- input)
1 1
1 3
2 4
5 3

1

में एक समाधान perl:

perl -lane '
 push @first , $F[0];
 push @second, $F[1];
 END{
    @first = sort { $a <=> $b } @first;
    print "$fist[$_] $second[$_]" for (0..$#first)
 }' your_file

यह मान लेता है कि पहला कॉलम (एक को सॉर्ट किया जाना है) में केवल संख्यात्मक डेटा होते हैं।


0

मैं सोलारिस पर हूं और बिना छांटे के उत्तर की आवश्यकता है और स्वीकृत उत्तर मेरे लिए काम नहीं कर रहा था। Unix.com पर जॉयग का जवाब था: सॉर्ट-वन-कॉलम-ओनली

cat tmp.txt
1 5
2 3
5 4
1 3

#Sort by 1st column leaving second stable sorted by the 1st.
cat -n tmp.txt | sort -k 2,2 | awk '{print $2,$3}'
1 5
1 3
2 3
5 4

#Sort by 2nd column leaving first stable sorted by the 2nd.
cat -n tmp.txt | sort -k 3,3 | awk '{print $2,$3}'
2 3
1 3
5 4
1 5

टिप्पणी के माध्यम से अलग व्याख्या बाकी को प्रभावित किए बिना एक कॉलम को सॉर्ट करने के लिए है:

#Sort by 1st column leaving other columns untouched:
cat -n tmp.txt | sort -k 2,2 | awk '{a[NR]=$2;b[$1]=$3} END {for (i=1;i<=NR;i++)print a[i]" "b[i]}'
1 5
1 3
2 4
5 3

Explanation:
cat -n adds rownums to force sort to do "sort -s" without GNU sort.
sort -k 2,2 sorts by the 1st column

NR is a built-in variable that holds the row num.
a[NR]=$2; puts the sorted column in a[1..4]
b[$1]=$3; puts the "unsorted" 2nd column in b[rownum from cat]
Then the for loop just outputs the two arrays.

मुझे क्या ज़रूरत थी जो फ़ाइल में नवीनतम अद्वितीय कॉलम 3 प्रविष्टियां थी। जैसे

cat tmp2.txt
5|1|3
4|2|1
1|3|2
3|4|1
2|5|2

cat -n tmp2.txt | sort -k 3 -rut '|' | awk '{print $2}'
5|1|3
2|5|2
3|4|1

काम नहीं किया। इसने मुझे first column - 1 2 5 1 दूसरा कॉलम दिया1 3 4 3
user13107

@ user13107 क्या आपने पहला ब्लॉक कैट-एन टीएमपी चलाने की कोशिश की थी सॉर्ट -k 2,2 | awk '{प्रिंट $ 2, $ 3}'? चाल कैट-एन में है। जो सॉर्ट से पहले संख्याओं को आउटपुट करता है। कल फिर से होगा।
user1361991

@ user13107 ने उत्तर दिया और उत्तर का विस्तार किया।
user1361991

आपका पहला कॉलम पहले उदाहरण में अपरिवर्तित नहीं है। यह अंत में 2 1 5 1 है और यह शुरू में 1 2 5 1 था।
user13107

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