किसी फ़ील्ड के लिए उसके संख्यात्मक मानों के आधार पर फ़ाइल को कैसे सॉर्ट करना है?


114

उदाहरण file.txt:

  100 foo
  2 bar
  300 tuu

उपयोग करते समय sort -k 1,1 file.txt, लाइनों का क्रम नहीं बदलेगा, हालांकि हम उम्मीद कर रहे हैं:

  2 bar
  100 foo
  300 tuu

पूर्ण संख्यात्मक मान के आधार पर संख्याओं से युक्त फ़ील्ड को कैसे सॉर्ट करना है?

जवाबों:


149

सॉर्ट के लिए मैन पेज पर एक नज़र डालें ...

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

तो यहाँ एक उदाहरण है ...

sort -n filename

1
आप सभी को धन्यवाद, दोस्तों! यह वायर्ड है, क्योंकि मैंने इसके मैन पेज को कई बार आगे-पीछे किया और मैंने वह विकल्प नहीं देखा। आह, मैं एक सरलीकृत आदमी पृष्ठ पर था। अरे नहीं!
लुकमैक

1
कृपया ध्यान दें कि, फ्लोटिंग पॉइंट्स के लिए, उपयोग -g, --general-numeric-sortकरना अधिक उचित हो सकता है। यह आगे वैज्ञानिक संकेतन की अनुमति देता है जैसे 1.234E10 इत्यादि
फ्री इंजीनियर

103

यदि आप ऐसे तार छांट रहे हैं जो मिश्रित पाठ और संख्याएँ हैं, उदाहरण के लिए रोलिंग लॉग के फ़ाइलनाम तो फिर से छँटाई करना sort -nअपेक्षित नहीं है:

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

उस मामले में विकल्प -Vचाल करता है:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

मैन पेज से:

   -V, --version-sort
          natural sort of (version) numbers within text

1
इसने मुझे उलझा दिया, इसलिए धन्यवाद! दूसरी चीज जिसने मुझे गड़बड़ कर दिया, कम से कम मेरे साइबरविन पर, वह यह है कि जब अक्षरों को हटाने और केवल संख्याओं को छोड़ने के लिए प्रतिस्थापन के lsमाध्यम से पाइपिंग करते हैं sed, तो जाहिर तौर पर रंगीन आउटपुट चीजों को भी प्रभावित कर रहे थे। इसलिए दौड़ने से ls --color=neverभी फर्क पड़ा।
मैक्स स्टार्कबर्ग

बहुत बढ़िया, -Vबिल्कुल वही जो मैं देख रहा था। मुझे पहले पुरुष पृष्ठों के माध्यम से देखने की आदत डालनी चाहिए।
srowley

18

खैर, ज्यादातर अन्य जवाब यहाँ देखें

sort -n

हालाँकि, मुझे यकीन नहीं है कि यह नकारात्मक संख्याओं के लिए काम करता है। यहां मैं फेडोरा 9 पर 6.10 के सॉर्ट संस्करण के साथ परिणाम प्राप्त कर रहा हूं।

इनपुट फ़ाइल:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

आउटपुट:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

जो स्पष्ट रूप से संख्यात्मक मूल्य द्वारा आदेशित नहीं है।

फिर, मुझे लगता है कि अधिक सटीक उत्तर का उपयोग करना होगा, sort -nलेकिन केवल तभी जब सभी मूल्य सकारात्मक हों।

पुनश्च: sort -gइस उदाहरण के लिए केवल एक ही परिणाम का उपयोग करना

संपादित करें:

ऐसा लगता है कि स्थानीय सेटिंग प्रभावित करती हैं कि माइनस साइन ऑर्डर को कैसे प्रभावित करता है ( यहां देखें )। उचित परिणाम प्राप्त करने के लिए मैंने अभी-अभी:

LC_ALL=C sort -n filename.txt



1

आपको निम्न आदेश करना चाहिए:

sort -n -k1 filename

इससे हो जाना चाहिए :)


-1

अवरोही क्रम में छंटाई के लिए सॉर्ट -nr का उपयोग करें। देखें

तरह

अधिक संदर्भ के लिए उपरोक्त मैन पेज देखें


-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

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