मैं प्रमुख.मिनोर.पच स्तर और कभी-कभी आरसी के साथ एक सूची को कैसे सही तरीके से सॉर्ट कर सकता हूं?


18

मुझे एक शेल स्क्रिप्ट के साथ निम्न सूची को सॉर्ट करना होगा और नवीनतम संस्करण को नीचे या ऊपर दिखाई देगा। मैं केवल शेल टूल्स के साथ ऐसा कैसे करूंगा?

release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

1
यह भी देखें printf '%s\n' ${(on)array}में zsh। (जब सूची $arrayसरणी में है)।
स्टीफन चेज़लस

जवाबों:


20

GNU सॉर्ट में -Vऐसी सूची है जो ज्यादातर उस ( विवरण ) से निपट सकती है :

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

$ cat vers
release-5.0.19
release-5.0.19~pre1
release-5.0.19-bigbugfix
release-5.0.2
release-5.0.20
$ sort -V vers
release-5.0.2
release-5.0.19~pre1
release-5.0.19
release-5.0.19-bigbugfix
release-5.0.20

हालाँकि, उन .rc*संस्करणों में थोड़ी समस्या हो सकती है, क्योंकि संभवतः उन्हें इसी गैर-आरसी संस्करण से पहले क्रमबद्ध किया जाना चाहिए , अगर दोनों के बीच ऐसा हुआ हो, तो यह है। कुछ संस्करण प्रणाली (जैसे डेबियन), ~प्री-रिलीज़ को चिह्नित करने के लिए एक टिल्ड ( ) के साथ शुरू होने वाले प्रत्ययों का उपयोग करती हैं , और वे एक प्रत्यय के बिना संस्करण से पहले सॉर्ट करते हैं, जो अन्य प्रत्ययों के साथ संस्करणों से पहले सॉर्ट करता है। स्पष्ट रूप से यह sortमेरे सिस्टम पर कम से कम द्वारा समर्थित है , जैसा कि ऊपर दिखाया गया है ( sort (GNU coreutils) 8.23)।


3
कुछ ही सेकंड में मुझे छीन लिया :)
rosuav

1
बहुत बहुत धन्यवाद। कल्पना भी नहीं की थी कि उस तरह का एक विकल्प होगा।
मंडागोर

FWIW, OpenBSD पर -Vडिफ़ॉल्ट रूप से समर्थित है sort, लेकिन NetBSD पर नहीं।
Kusalananda

FreeBSD भी, जाहिरा तौर पर , वहाँ आदमी पृष्ठ भी एक उदाहरण उत्पादन आदेश है, और OpenBSD एक समान दिखता है।
ilkachachu

7

देखें sort -V:

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

वर्जन नंबर जटिल जानवर होते हैं, जिनमें अल्फ़ाबेटिक अंशों को नियंत्रित करने वाले बहुत कम मानक होते हैं, लेकिन अपने वास्तविक डेटा पर यह प्रयास करें और देखें कि क्या यह पर्याप्त है।


वाह महान! यह फ़ाइल नाम के साथ मेरी एक पुरानी समस्या के लिए भी काम करता है mayorNumber–minorNumer some text, जहां यूनिकोड सीमांकक के कारण फ़ील्ड छँटाई विफल हो जाती है। संकेत के लिए धन्यवाद!
फिलिप्पो

3

इसे एक पंक्ति के रूप में किया जा सकता है, लेकिन पठनीयता के लिए यहां कई लाइनों (पाइपों पर) में विभाजित किया गया है, और इसे भी संभालता rcहै।

यदि आपके पास -Vअपने प्रकार के लिए कोई विकल्प नहीं है , या यहां तक ​​कि अगर आप ऐसा करते हैं, तो आपको कभी-कभार निपटने की आवश्यकता होगी rc:

cat versionlist |
sed -e "s/release-//" -e "s/rc//" |
sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 |
sed -r -e "s/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)/\1.\2.\3.rc\4/" -e "s/^/release-/"

पहले sedस्ट्रिप्स गैर-न्यूमेरिक वर्ण का उपयोग करता है एक सीमांकक ( ), संख्यात्मक प्रकार (- ), और चाबी ( ) अंतिम पुट गैर-न्यूमेरिक वर्ण जगह में वापस।
sort.-t.n-k
sed


0

सभी प्रेरणा के लिए धन्यवाद - क्या मैं अपना खुद का जवाब प्रस्तावित कर सकता हूं: जिस तरह की जरूरत है उसे करने में क्रमबद्ध प्रोग्राम को धोखा दिया जा सकता है। अंत में यह 3 अंकों के संस्करण में एक चौथे नंबर को जोड़ने के बारे में है, इसे सॉर्ट करें, और फिर इसे फिर से निकालें। काम करता है - अब तक का सबसे सरल समाधान, IMHO।

cat versionlist |\
sed -r "s/([0-9]+\.[0-9]+\.[0-9]+$)/\1\.99999/"|sort -V|sed s/\.99999$//

परिणाम:

release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0

....

0
$ cat /tmp/tmp.tmp
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

$ cat /tmp/tmp.tmp | awk -F\- '{ print $2,$1 }' | sort -n | awk '{ print $2 "-" $1 }'
release-5.0.0
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

$

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