बैश स्क्रिप्ट का उपयोग करके स्ट्रिंग को कैसे सॉर्ट करें जो स्ट्रिंग + न्यूमेरिक के साथ संयुक्त है?


27

यह वह डेटा है जिसे मैं सॉर्ट करना चाहता हूं। लेकिन sortसंख्यात्मक को स्ट्रिंग करने के लिए व्यवहार करता है, यह डेटा जैसा कि मुझे उम्मीद था कि कोई हल नहीं किया गया है।

/ घर / फाइलें / प्रोफाइल 1
/ घर / फाइलें / प्रोफाइल 10
/ घर / फाइलें / प्रोफाइल 11
/ घर / फाइलें / प्रोफाइल 12
/ घर / फाइलें / प्रोफाइल 14
/ घर / फाइलें / प्रोफाइल 15
/ घर / फाइलें / प्रोफाइल 16
/ घर / प्रोफाइल 2
/ घर / फाइलें / प्रोफाइल 3
/ होम / फाइलें / प्रोफाइल 4
/ घर / फाइलें / प्रोफाइल 5
/ घर / फाइलें / प्रोफाइल 6
/ घर / फाइलें / प्रोफाइल 7
/ घर / फाइलें / प्रोफाइल 8
/ घर / फाइलें / प्रोफाइल 9

मैं इसे क्रमबद्ध करना चाहता हूं,

/ घर / फाइलें / प्रोफाइल 1
/ घर / फाइलें / प्रोफाइल 2
/ घर / प्रोफाइल 3
/ घर / फाइलें / प्रोफाइल 4
/ घर / फाइलें / प्रोफाइल 5
/ घर / फाइलें / प्रोफाइल 6
/ घर / फाइलें / प्रोफाइल 7
/ घर / फाइलें / प्रोफाइल 8
/ घर / फाइलें / प्रोफाइल 9
/ घर / फाइलें / प्रोफाइल 10
/ घर / फाइलें / प्रोफाइल 11
/ घर / फाइलें / प्रोफाइल 12
/ घर / फाइलें / प्रोफाइल 14
/ घर / फाइलें / प्रोफाइल 15
/ घर / फाइलें / प्रोफाइल 16

क्या बैश स्क्रिप्ट द्वारा एक अच्छा तरीका है? मैं यहाँ रूबी या अजगर स्क्रिप्ट का उपयोग नहीं कर सकता।


"सॉर्ट-एंड" का उपयोग करने की कोशिश करें
बोबाह

1
@ सोबाह, "सॉर्ट: ऑप्शन्स` -dn 'असंगत हैं "
maxschlepzig

10
sort -Vकरेंगे।
थोर

2
@Thor। आपकी टिप्पणी का एक अच्छा जवाब होगा
पीटर।

जवाबों:


21

आप संख्या को परिसीमित करने के लिए एक अस्थायी प्रहरी वर्ण का उपयोग कर सकते हैं:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

यहाँ, प्रहरी चरित्र 'है;' - यह किसी भी फ़ाइलनाम का हिस्सा नहीं होना चाहिए जिसे आप सॉर्ट करना चाहते हैं - लेकिन आप 'का आदान-प्रदान कर सकते हैं;' किसी भी किरदार को आप पसंद करते हैं। आप बदलना होगा sed, sortऔर trउसके बाद भाग तदनुसार।

पाइप निम्नानुसार काम करता है: sedकमांड किसी भी संख्या से पहले प्रहरी को सम्मिलित करता है, sortकमांड प्रहरी को क्षेत्र परिसीमाक के रूप में व्याख्या करता है, दूसरे फ़ील्ड के साथ संख्यात्मक सॉर्ट कुंजी के रूप में और trकमांड प्रहरी को फिर से हटाता है।

और logइनपुट फ़ाइल को दर्शाता है - आप अपने इनपुट को भी पाइप कर सकते हैं sed


मुझे आपकी समस्या हल करने का तरीका पसंद है :)
SHW

44

यह इस सवाल से बहुत मिलता-जुलता है । परेशानी यह है कि आपके पास एक अल्फ़ान्यूमेरिक फ़ील्ड है जिसे आप छाँट रहे हैं, और -nउस समझदारी से व्यवहार नहीं करता है, हालांकि संस्करण सॉर्ट ( -V) करता है। इस प्रकार उपयोग करें:

sort -V

ध्यान दें कि यह सुविधा वर्तमान में GNU, FreeBSD और OpenBSD तरह के कार्यान्वयन द्वारा समर्थित है।


क्या आप जानते हैं कि यह कितना पोर्टेबल है? यह विकल्प POSIX युक्ति का हिस्सा नहीं लगता है।
अर्नेस्ट ए

@ErnestA: आप सही हैं, यह GNU सॉर्ट विशिष्ट समाधान है। एक नोट जोड़ा।
थोर

@ErnestA: मुझे ऐसा लग रहा है कि FreeBSD और OpenBSD ने इस सुविधा को जोड़ दिया है।
थोर

और यह काम नहीं करता है यदि संख्याओं में अलग-अलग उपसर्ग हैं।
डांटे

1
किसी भी पाठक के लिए: ध्यान दें कि यह एक CAPITAL V है! उपयोग sort -Vन करें sort -v। पहली नज़र में बताना मुश्किल है।
गेब्रियल स्टेपल्स

7

यदि अंतिम सांख्यिक भाग से पहले आपके सभी फ़ाइल नामों में एक ही उपसर्ग है, तो छँटाई करते समय इसे अनदेखा करें:

sort -k 1.20n

(20 पहले अंक की स्थिति है। यह एक प्लस की लंबाई है /home/files/profile)

यदि आपके पास कई अलग-अलग गैर-संख्यात्मक भाग हैं, तो एक प्रहरी डालें

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