"क्रमबद्ध" कमांड का उपयोग करके कॉलम प्राथमिकता द्वारा CSV फ़ाइल को सॉर्ट करें


94

मेरे पास एक csv फ़ाइल है, और मैं इसे कॉलम प्राथमिकता के आधार पर क्रमबद्ध करना चाहूंगा, जैसे "ऑर्डर बाय"। उदाहरण के लिए:

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1

यदि यह स्थिति "चयन" का परिणाम थी, तो "द्वारा क्रम" इस प्रकार होगा: कॉलम 2, कॉलम 1, कॉलम 3 द्वारा आदेश - परिणाम होगा:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1

मैं जानना चाहूंगा कि यूनिक्स पर "सॉर्ट" कमांड का उपयोग करके यह समान परिणाम कैसे प्राप्त करें।


4
वैसे, यह एक ssv फ़ाइल है (अर्धविराम से अलग किए गए मान): P
जॉन स्ट्रोड

जवाबों:


157
sort --field-separator=';' --key=2,1,3

9
यदि मान संख्यात्मक हैं, तो आप शायद उस -nविकल्प का उपयोग करना चाहते हैं जो "स्ट्रिंग संख्यात्मक मान के अनुसार तुलना करेगा" या वह -gविकल्प जो "सामान्य संख्यात्मक मान के अनुसार तुलना करेगा"। संख्यात्मक मानों की एक स्ट्रिंग की तरह क्रमबद्ध संख्याएं प्राप्त करेंगी 1,10,2,20। कम से कम वे CentOS पर मेरे प्रकार के संस्करण पर उपलब्ध विकल्प हैं। आपको मैन पेज के साथ सत्यापित करना चाहिए कि आपके सॉर्ट के संस्करण में सही विकल्प क्या हैं।
एडम पोरड

5
मुझे मिलता हैsort: stray character in field spec: invalid field specification ‘2,1,3’
मार्टिन थोमा

3
हालांकि, sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csvमेरे लिए काम किया।
मार्टिन थोमा

6
@MartinThoma यह एक लंबा समय हो गया है लेकिन मैं आपकी समस्या में भाग गया और मैंने पाया sort --field-separator=';' --key={2,1,3}। इसने GNU coreutils 8.4अप्रैल 2016 से काम किया
mrbolichi

3
@mrbolichi संकेतन --key={2,1,3}का उपयोग ब्रेस के ब्रेस विस्तार का उपयोग करता है
नोवा

28

मान लीजिए कि 3;10;3आपकी unsorted.csvफाइल में एक और पंक्ति है । फिर मुझे लगता है कि आप संख्यात्मक रूप से हल किए गए परिणाम की अपेक्षा करते हैं:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3

और एक वर्णानुक्रम में नहीं छांटा गया:

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1

इसे पाने के लिए, आपको उपयोग करना होगा -n:

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv

यह ध्यान देने योग्य है कि 2,2इसका उपयोग किया जाना है। यदि केवल 2उपयोग किया जाता है, तो sortस्ट्रिंग को फ़ील्ड 2 की शुरुआत से अंत तक ले जाता है। 2,2यह सुनिश्चित करता है कि केवल फ़ील्ड 2का उपयोग किया जाता है।


7
सूचक के बीच अंतर के रूप में -k 2, और -k 2,2 महत्वपूर्ण है! मैन पेज के मेरे पहले पढ़ने पर मैंने इसे अनदेखा कर दिया था। धन्यवाद।
usonianhorizon

मैं जोड़ा कुछ अतिरिक्त पंक्तियाँ, 3;10;3, 3:10:5, 3:10;2,3;10;3 स्रोत फ़ाइल में इसी क्रम में, और का उपयोग करते समय बस -k 2,2 यह कॉलम 2 और 3 आदमी पेज का कहना है पर सॉर्ट करने के लिए प्रकट होता है "The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."। मेरे मामले में पहले वाली कुंजी (मूल्य = 10) की तुलना बराबर थी, हालांकि, मैंने -kकई बार निर्दिष्ट नहीं किया । मुझे यकीन नहीं है कि यह विश्वसनीय व्यवहार है, या मेरे सिस्टम (मैक) से संबंधित है। अंततः यह मायने नहीं रखता है, जब तक कि प्राथमिक छँटाई सही है।
दावोस

ओह, मैं देख रहा हूं कि -sस्थिर प्रकार भी है जो समान कुंजियों को नजरअंदाज करता है, यह स्पष्ट रूप से मनुष्य के अनुसार तेज है।
दावोस

24

ऊपर चार्ली का जवाब मेरे लिए सिगविन (सॉर्ट वर्जन 2.0, जीएनयू टेक्सटाइल) पर काम नहीं किया, निम्नलिखित ने किया:

sort -t"," -k2 -k1 -k1

3
साइगविन का एक पुराना संस्करण है। हमेशा की तरह, मैन पेज आपका दोस्त है।
चार्ली मार्टिन

2
मैं @CharlieMartin से सहमत हूं, आपको अपने सिस्टम पर मैन पेज की जांच करनी चाहिए। सेंटोस पर मैंने इस्तेमाल कियाsort --field-separator=';' -k2 -k1 -k3 test.csv
एडम पोरड

-6

..और अगर किसी ने 'सॉर्ट' समाधान का पालन किया है, लेकिन अब प्रति पंक्ति एकल एकल प्रविष्टि (यानी अद्वितीय प्रविष्टियों की शीर्ष X संख्या) से अधिक प्राप्त करना चाहता है, तो एक बार जब आप 'सॉर्ट' का उपयोग करके फ़ाइल को सॉर्ट करते हैं, तो आप उपयोग कर सकते हैं एक छोटा सा ऐप जो मैंने यहां बनाया है:

https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java


2
आपके लिए अच्छा हैं! लेकिन आपके मामले में, आप बस इस्तेमाल कर सकते हैं cat unsorted-file | sort | uniq | head -X- जब Xआप उत्पादन करना चाहते हैं पहली पंक्तियों की संख्या है।
स्लाविक मेल्टसर

@SlavikMe टिप्पणी के लिए बहुत बहुत धन्यवाद! हालाँकि, आपका सुझाव एक अलग परिणाम देता है .. आपके सुझाव को पूरी तरह से सॉर्ट की गई फ़ाइल में पहली X लाइन्स मिलती हैं, जबकि हम चाहते थे कि आपको "की" प्रति पहली X लाइन्स मिलें (यानी अगर आपके पास नामों के साथ CSV है, तो आप सॉर्ट करें कॉलम 2 "अंतिम नाम" के बाद, आपके आदेशों को शायद अंतिम नाम के रूप में "एलन" के साथ केवल 3 लाइनें मिलेंगी, जबकि हमारे "एलन", "ब्रिटैन", "चार्ल्स" आदि) को मिलेंगे। हालांकि धन्यवाद!
डैनियल Iveren

6
तुम गलत हो। टिप्पणी करने से पहले मैंने जो कमांड लिखी थी उसे आजमाने का सुझाव दूंगा। ध्यान दें, कि uniqपाइप के क्रम में एक आदेश है, sortऔर के बीच head, जो शीर्ष पंक्तियों के निष्कर्षण से ठीक पहले सभी क्रमबद्ध पंक्तियों को एक विशिष्टता प्रदान करता है।
स्लाविक मेल्टर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.