यूनिक्स सॉर्ट का उपयोग करके कस्टम छंटाई कैसे करें?


11

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

किसी भी छँटाई से पहले उदाहरण फ़ाइल:

C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1

फ़ाइल को क्रमबद्ध करें: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

क्रमबद्ध परिणाम:

A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1

यहाँ मुद्दा है: मैं एक कस्टम प्रकार के आधार पर कॉलम 2 को सॉर्ट करना चाहता हूं, जिसका अर्थ है कि मैं पहले संयुक्त राज्य चाहता हूं, फिर कनाडा, फिर बहामा:

वांछित प्रकार:

A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2

क्या यूनिक्स पास करने का कोई तरीका है जो एक कस्टम प्रकार का क्रम है जिसे वह तब लागू कर सकता है? कुछ इस तरह: $ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

धन्यवाद!


3
इन तीन मूल्यों के लिए, आप रिवर्स अल्फाबेटिक ऑर्डर चाहते हैं। सामान्य स्थिति के लिए, आपको नामों को सॉर्ट क्रम संख्या में मैप करना होगा, और फिर सॉर्ट क्रम संख्या का उपयोग करके सॉर्टिंग करना होगा। या एक स्क्रिप्टिंग भाषा के लिए जाएं ... एक संभावना joinकमांड है, लेकिन आप बहुत सारे छंटनी के साथ समाप्त हो सकते हैं - एक के लिए इनपुट फ़ाइलों joinको एक क्रम में सॉर्ट किया जाना चाहिए, और फिर आप sortडेटा डालने के लिए फिर से उपयोग करेंगे। एक अलग क्रम (और सॉर्ट क्रम स्तंभ को एक पोस्ट-सॉर्ट चरण के रूप में खोना)।
जोनाथन लेफ्लर

आपके उदाहरण इनपुट में, अंतिम पंक्ति के tबजाय नहीं होना चाहिए f?
लेव लेवित्स्की

Lev: हाँ, अच्छा पकड़। मेरी गलती; बहुत अधिक काटना और चिपकाना (मेरा वास्तविक डेटा सेट बहुत बड़ा है और मैंने गलती से गलत पंक्तियों को पकड़ लिया है)।

मैंने आपके डेटा से मिलान करने का उत्तर अपडेट किया है।
लेव लेवित्स्की

जवाबों:


8

अन्य उत्तर और टिप्पणी सामान्य रूप से प्रश्न का उत्तर देते हैं, यहां एक कार्यान्वयन कैसे दिख सकता है:

$ cat order
Bahamas,3
Canada,2
United States,1

$ cat data
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1

$ sort -t, -k2 data | join -t, -11 -22 order - | sort -t, -k2n -k4,5 -k6r -k7nr | cut -d, -f 3,1,4-7
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2

बहुत बढ़िया, आपकी मदद के लिए धन्यवाद। यह पूरी तरह से काम किया!

@ ज्वालिया एक बार फिर सुधरी, sedयहाँ वास्तव में जरूरत नहीं थी।
लेव लेवित्स्की

1

आप ऐसा नहीं कर सकते के साथ तरह । इस बिंदु पर, आपको वास्तव में awk / perl / your-language-of-choice के लिए पहुंचना चाहिए । आप इसे ठग सकते हैं, हालाँकि। उदाहरण के लिए, आप "यूनाइटेड स्टेट्स" को 0 में बदलने के लिए, "कनाडा" को 1 और "बहामास" को 2 में बदलने के लिए sed का उपयोग कर सकते हैं, फिर उस कॉलम के खिलाफ एक संख्यात्मक प्रकार कर सकते हैं, फिर इसे वापस कर सकते हैं। या "संयुक्त राज्य अमेरिका" को "संयुक्त राज्य अमेरिका, 0" आदि में बदल दें, अतिरिक्त कॉलम के खिलाफ सॉर्ट करें और फिर इसे छोड़ दें।


0

मैंने बस ऐसा करने के लिए आसान बनाने के लिए csort नामक एक सहायक लिखा था । यह प्रत्येक पंक्ति को उप-रेखा के आधार पर आपके चयन के मूल्य के साथ उपसर्ग करता है या नियमित अभिव्यक्ति से मेल खाता है:

$ csort -t, '2=United States' X 2=Canada Y 2=Bahamas Z < tmp.csv | \
sort -t, -k1,1 -k3,3 -k4,4 -k5,5 -k6,6r -k7,7nr
X,A,United States,MA,Boston,f,0
X,B,United States,NY,New York,f,5
X,A,United States,NY,New York,f,1
X,C,United States,WA,Tacoma,f,1
Y,A,Canada,QC,Montreal,f,2
Z,A,Bahamas,Bahamas,Nassau,f,2

2=STRअंकन का अर्थ है "मैच दूसरे क्षेत्र के बराबर होती है, तो STR"।

तब आप cut -c3-उपसर्ग को हटाने के लिए वैकल्पिक रूप से आउटपुट को पाइप कर सकते हैं ।

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