2008-12-10 8 views
113

के साथ एकाधिक कुंजियों को सॉर्ट करना मेरे पास संभावित रूप से बड़ी फ़ाइलें हैं जिन्हें 1-एन कुंजी द्वारा सॉर्ट करने की आवश्यकता है। इनमें से कुछ चाबियाँ संख्यात्मक हो सकती हैं और उनमें से कुछ शायद नहीं हो सकती हैं। यह एक निश्चित चौड़ाई कॉलम फ़ाइल है इसलिए कोई डिलीमीटर नहीं है।यूनिक्स सॉर्ट

क्या यूनिक्स सॉर्ट के साथ ऐसा करने का कोई अच्छा तरीका है? एक कुंजी के साथ यह '-n' का उपयोग करने जितना आसान है। मैंने मैन पेज पढ़ा है और Google को संक्षेप में खोजा है, लेकिन एक अच्छा उदाहरण नहीं मिला। मैं इसे पूरा करने के बारे में कैसे जाउंगा?

नोट: मैंने फ़ाइल आकार की क्षमता के कारण पर्ल से इंकार कर दिया है। यह एक अंतिम उपाय होगा।

+0

एक या दो लाइनों के रूप में 110 उदाहरण कमांड लाइन बनाने के लिए वास्तव में मददगार होगा होगा। साथ ही, क्या "1-n" कुंजी का मतलब है कि आपको कुंजियों की एक चर संख्या द्वारा क्रमबद्ध करने की आवश्यकता है? ऐसा करने के बिना स्क्रिप्टिंग के बिना मजेदार होगा ... –

+0

मेरे पास 1-एन सुविधा सक्षम करने के लिए सॉर्ट कमांड के चारों ओर एक PHP wrapper है। –

उत्तर

56

-k विकल्प (या --key=POS1[,POS2]) का उपयोग करें। यह कई बार प्रदर्शित हो सकता है और प्रत्येक कुंजी में वैश्विक विकल्प हो सकते हैं (जैसे n संख्यात्मक क्रम के लिए)

+6

सॉर्ट मैन पेज से: "पीओएस एफ [सी] [ओपीटीएस] है, जहां एफ फ़ील्ड नंबर और सी क्षेत्र में चरित्र की स्थिति है, दोनों मूल हैं 1." पूर्ण दस्तावेज के लिए मैन पेज देखें। –

+37

अगर आप पागल नहीं होना चाहते हैं तो एंड्रस का जवाब भी देखें। – ron

+1

उपरोक्त दोनों टिप्पणियां सटीक और योजक हैं। धन्यवाद, सज्जनो। –

85

-k विकल्प वह है जो आप चाहते हैं।

-k 1.4,1.5n -k 1.14,1.15n 

चरित्र का उपयोग करेंगे पहले क्षेत्र (यह निश्चित चौड़ाई के लिए सब एक क्षेत्र है) और तरह संख्यानुसार के रूप में पहली कुंजी में 4-5 की स्थिति।

दूसरी कुंजी पहले फ़ील्ड में भी 14-15 वर्ण होगी।

(संपादित करें)

उदाहरण (सभी मेरे पास है DOS/cygwin से उपयोगी है):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r 
डेटा के लिए

: महीने संख्या से

12/10/2008 01:10 PM   1,564,990 outfile.txt 

क्रमित निर्देशिका सूची (स्थिति 4-5) संख्यात्मक रूप से, और उसके बाद फ़ाइल नाम (pos 40-60) रिवर्स में। चूंकि कोई टैब नहीं है, इसलिए यह क्रमबद्ध करने के लिए सभी फ़ील्ड 1 है।

+0

इनपुट डेटा में कोई रिक्त स्थान नहीं होने पर यह केवल एक फ़ील्ड है। फिर भी, आपका उदाहरण उपयोगी है। –

+0

सुधार: यदि इनपुट डेटा में कोई/टैब/नहीं है। डॉस के 'डीआईआर' कमांड आउटपुट में, कोई टैब नहीं हैं। –

+0

विकल्प (संख्यात्मक, रिवर्स) का उपयोग करने के तरीके के बारे में उदाहरण बेहद सहायक हैं, क्योंकि यह पता लगाना लगभग असंभव है कि मैन पेज से कैसे उपयोग किया जाए और अन्य उत्तरों ने इसका उल्लेख नहीं किया। काश मैं इसके लिए +2 कर सकता था। ;) – msb

10

मैं की तरह

sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile 

अपने मामले कुछ में विश्वास करते हैं बेहतर काम करेंगे। @ फ़ील्ड सेपरेटर है, सुनिश्चित करें कि यह एक ऐसा चरित्र है जो कहीं भी दिखाई नहीं देता है। तो आपके इनपुट को एक कॉलम के रूप में माना जाता है।

संपादित करें: स्पष्ट रूप से clintp पहले से ही एक ही जवाब दिया, क्षमा करें। जैसा कि वह बताता है, झंडे 'एन' और 'आर' को हर-विकल्प में जोड़ा जा सकता है .... विकल्प।

262

लें देखभाल हालांकि:

आप मुख्य रूप से क्षेत्र 3 से फ़ाइल क्रमबद्ध करना चाहते हैं, और दूसरी प्राथमिकता क्षेत्र 2 से आप इस नहीं करना चाहते हैं:

sort -k 3 -k 2 < inputfile 

आप इस बजाय हैं:

sort -k 3,3 -k 2,2 < inputfile 

पहली बार स्ट्रिंग द्वारा फ़ाइल 3 की शुरुआत से लाइन के अंत तक (जो संभवतः अद्वितीय है) से स्ट्रिंग द्वारा फ़ाइल को टाइप करता है।

-k, --key=POS1[,POS2]  start a key at POS1 (origin 1), end it at POS2 
          (default end of line) 
+19

यह काफी महत्वपूर्ण है, धन्यवाद! – ron

+6

जीवन बदल रहा है। धन्यवाद। – notJim

+2

अरे! अब मुझे एक स्क्रिप्ट ठीक करनी है क्योंकि पहले मैंने केवल ऊपर पहला जवाब देखा था ... अच्छी बात यह है कि मैंने स्क्रिप्ट आउटपुट पर अभी तक निर्भर नहीं किया है .... – Wildcard

5

नोट है कि भी -s स्विच के साथ प्रकार स्थिर करने के लिए इतना है कि समान रूप से स्थान पर रहीं लाइनों भी उत्पादन में उनके मूल रिश्तेदार व्यवस्था बनाए रखने के वांछित जा सकता है।

2

मैं कुछ सुझाव जोड़ना चाहता हूं, जब आप सॉर्ट का उपयोग करते हैं, तो अपने लोकेल के बारे में सावधान रहें जो कुंजी तुलना के क्रम को प्रभावित करता है। मैं आम तौर पर जो चाहता हूं उसे ढूंढने के लिए मैं स्पष्ट रूप से LC_ALL = C का उपयोग करता हूं।

+0

एलसी_ALL = सी भी काफी तेज हो सकता है! –

16

यहाँ सांख्यिक और शब्दकोश आदेश से एक csv फ़ाइल में विभिन्न स्तंभों को क्रमित करने के लिए एक, कॉलम 5 और के रूप में शब्दकोश आदेश

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv 
1,10,b,22,Ga 
2,2,b,20,F 
2,2,b,22,Ga 
2,2,c,19,Ga 
2,2,c,19,Gb,hi 
2,2,c,19,Gb,hj 
2,3,a,9,C 

~/test>cat sort.csv 
2,3,a,9,C 
2,2,b,20,F 
2,2,c,19,Gb,hj 
2,2,c,19,Gb,hi 
2,2,c,19,Ga 
2,2,b,22,Ga 
1,10,b,22,Ga 

नोट के बाद -k1,1n स्तंभ 1 और में समाप्त होने पर संख्यात्मक मूल्य उस का मतलब स्तंभ 1. अगर मैं नीचे किया था, यह श्रेणीबद्ध स्तंभ 1 और 2 बनाने 1,10 अनुसार क्रमबद्ध उदाहरण डेटा की

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv 
2,2,b,20,F 
2,2,b,22,Ga 
2,2,c,19,Ga 
2,2,c,19,Gb,hi 
2,2,c,19,Gb,hj 
2,3,a,9,C 
1,10,b,22,Ga 
+1

यह सबसे अच्छा जवाब है क्योंकि यह दिखाता है कि अलग-अलग कॉलम के लिए अलग-अलग स्विच का उपयोग कैसे करें – xaxa

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^