यूनिक्स सॉर्ट के साथ कई कुंजियों को क्रमबद्ध करना


137

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

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

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


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

1-n सुविधा को सक्षम करने के लिए मेरे पास एक PHP कमांडर है।
क्रिस क्लोबर्डनज़

जवाबों:


69

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


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

49
अगर आप पागल नहीं होना चाहते हैं, तो andras का जवाब भी देखें।
रॉन

1
उपरोक्त दोनों टिप्पणियाँ सटीक और योगात्मक हैं। धन्यवाद, सज्जनों।
केन जेंटल

314

हालांकि ध्यान रखना:

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

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

ऐसा नहीं है: sort -k 3 -k 2 < inputfile जो फ़ील्ड 3 की शुरुआत से पंक्ति के अंत तक स्ट्रिंग द्वारा फ़ाइल को सॉर्ट करता है (जो संभवतः अद्वितीय है)।

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

8
जीवन बदलने वाली। धन्यवाद।
davidtbernal

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

अच्छा! अब, क्या होगा यदि मैं फ्लीड 3 को संख्यात्मक रूप से और रिवर्स सॉर्ट करना चाहता हूं जबकि फ़ील्ड 2 को गैर-संख्यात्मक और सामान्य (आरोही) क्रमबद्ध किया जाना है? :)
अरुण

2
@ अरुण पीओएस को मैन पेज के अंत में समझाया गया है। आप बस क्रम संख्या के क्रम विकल्पों को इस तरह संलग्न करते हैं:sort -k 3,3nr -k 2,2
andras

1
Aargh। क्या एक counterintuitive इंटरफ़ेस: -k2होना चाहिए -k2,2और एक अनुगामी अल्पविराम -k2,होना चाहिए 'लाइन का जादुई डिफ़ॉल्ट अंत या जो भी हो'।
Android.weasel

94

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

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

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

दूसरी कुंजी पहले क्षेत्र में भी 14-15 अक्षर होंगे।

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

उदाहरण (मेरे पास सब कुछ डॉस / सागविन है):

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) द्वारा निर्देशिका सूची को सॉर्ट करता है, और फिर रिवर्स में फ़ाइल नाम (पॉज़ 40-60) द्वारा। चूंकि कोई टैब नहीं है, इसलिए यह सॉर्ट करने के लिए सभी फ़ील्ड 1 है।


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

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

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

22

यहां संख्यात्मक और डिक्शनरी ऑर्डर, कॉलम 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 बना देगा और 110 के रूप में क्रमबद्ध होगा।

~/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

12

मुझे आपके मामले में कुछ विश्वास है

sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile

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

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


भले ही डिफ़ॉल्ट विभाजक डॉक्स gnu.org/software/coreutils/manual/html_node/… पर जगह प्रदान कर रहा है, कभी-कभी फ़ील्ड गणना वह नहीं होती है जिसकी आप अपेक्षा करते हैं। शायद अन्य लोगों ने LC_CTYPE लोकेल सेटिंग के कारण यहां कहा है। जब संदेह की रेखा की शुरुआत से गिनती!
ब्रैड ड्रे

5

ध्यान दें कि -sस्विच के साथ सॉर्ट को स्थिर करने की इच्छा भी हो सकती है , ताकि समान रूप से रैंक की गई लाइनें आउटपुट में भी अपने मूल सापेक्ष क्रम को बनाए रखें।


2

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


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