तीसरे कॉलम के आधार पर छाँटें


130

मैं एक विशाल 4-कॉलम फ़ाइल का सामना कर रहा हूं। मैं इसके 3 कॉलम के आधार पर छंटनी में छँटनी की गई फ़ाइल दिखाना चाहता हूँ:

cat myFile | sort -u -k3

क्या यह चाल करने के लिए पर्याप्त है?


4
ध्यान दें कि आप इसे इस प्रकार लिख सकते हैं sort -u -k3 < myFile
गेरिट

6
जैसा कि sort -u -k3 myFile, यहां तक ​​कि
सेबस्टियन ग्राफ

जवाबों:


165
sort -k 3,3 myFile

कॉलम को मानने वाले 3 rd कॉलम द्वारा सॉर्ट की गई फ़ाइल को प्रदर्शित करेगा , जो वर्तमान लोकेल द्वारा परिभाषित क्रम के अनुसार, POSIX / C लोकेल में रिक्त स्थान (ASCII SPC और TAB वर्ण) के अनुक्रम द्वारा अलग की गई है।

ध्यान दें कि कॉलम में प्रमुख रिक्त स्थान शामिल किए गए हैं (डिफ़ॉल्ट विभाजक एक गैर-रिक्त से रिक्त स्थान के लिए संक्रमण है), जो उन स्थानों में अंतर कर सकता है जहां तुलना के उद्देश्य के लिए रिक्त स्थान की अनदेखी नहीं की जाती है, -bउपेक्षा करने के लिए विकल्प का उपयोग करें अग्रणी खाली है।

ध्यान दें कि यह शेल से पूरी तरह से स्वतंत्र है (सभी शेल उस कमांड लाइन को पार्स करेंगे, शेल आमतौर पर sortकमांड में निर्मित नहीं होते हैं )।

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

-uयदि उनमें से कोई एक ही है तो उसे पहचान के अनुसार बनाए रखना है (यानी जहां सॉर्ट कुंजी समान हो (यह जरूरी नहीं कि समान हो )।

catबिल्ली enate करने के लिए आदेश है । आपको इसकी आवश्यकता नहीं है।

यदि कॉलम किसी और चीज़ से अलग हो जाते हैं, तो आपको -tविभाजक को निर्दिष्ट करने के लिए विकल्प की आवश्यकता होती है ।

दिया उदाहरण फ़ाइल a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

के साथ -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

लाइन 2 और 3 में एक ही तीसरा कॉलम है, लेकिन यहां सॉर्ट कुंजी तीसरे कॉलम से लाइन के अंत तक है, इसलिए -uदोनों को बनाए रखता है। ␠ca␠dइससे पहले ␠c␠cकि मेरे लोकेल में पहले पास में स्थानों को नजरअंदाज किया जाता है, पहले cadसॉर्ट करें cc

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

केवल उन लोगों के लिए जिन्हें 3 कॉलम है, के ऊपर रखा गया है ␠c। ध्यान दें कि एक ␠␠c(2 प्रमुख रिक्त स्थान) के साथ कैसे बनाए रखा जाता है।

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

देखें कैसे के आदेश a b c dऔर a c c cउलट कर रहे हैं। पहले मामले में, क्योंकि ␠c␠cपहले की तरह ␠c␠d, दूसरे मामले में क्योंकि सॉर्ट कुंजी एक समान है ( ␠c), अंतिम रिज़ॉर्ट तुलना जो पूर्ण पुट के a b c dपहले की तुलना करती है a c c c

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

एक बार जब हम रिक्त स्थान को अनदेखा कर देते हैं, तो पहली 3 पंक्तियों के लिए सॉर्ट कुंजी समान होती है ( c), इसलिए वे अंतिम रिज़ॉर्ट तुलना द्वारा सॉर्ट किए जाते हैं।

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

सी लोकेल में, ␠␠cपहले की तरह सॉर्ट करें ␠cजहां केवल एक पास है जहां वर्ण (तब सिंगल बाइट्स) अपने कोड बिंदु मूल्य (जहां स्थान की तुलना में कम कोड बिंदु है c) के आधार पर सॉर्ट करता है ।


कॉलम blank-separated हैं जिसमें स्थान के आधार पर स्थान और टैब के अतिरिक्त अन्य वर्ण शामिल हो सकते हैं।
jfs

1
अच्छा लगा, १। क्या आप बता सकते हैं कि क्या 3,3करता है? सिर्फ क्यों नहीं 3?
terdon

@terdon, उदाहरण के साथ विस्तारित विवरण देखें।
स्टीफन चेज़लस

@JFSebastian, आप सही हैं, उत्तर अपडेट किया गया।
स्टीफन चेज़लस

आह, इसे केवल 3 पर क्रमबद्ध करने के लिए, शेष पंक्ति नहीं, धन्यवाद।
terdon

4

यदि आप "कॉलम" को पाठ फ़ाइल (4 वें वर्ण) के रूप में समझते हैं, तो हाँ, आपके समाधान को काम करना चाहिए (या रैंडम एक्सेस के साथ कुछ मेमोरी-सेविंग मैजिक्स sort -u -k3 myFileको अनुमति देने के sortलिए भी )। यदि आप डेटाबेस में "कॉलम" को समझते हैं - एक विभाजक, और चर स्तंभ चौड़ाई के बाद डेटा की एक पूरी इकाई, तो आपको कुछ कट्टरता की आवश्यकता होगी जैसे इस प्रकार ls -l आकार द्वारा

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(जो तुच्छ के बराबर है ls -lSलेकिन अच्छी तरह से उदाहरण प्रस्तुत करता है।)


5
नहीं, डिफ़ॉल्ट रूप से स्तंभ स्तंभ रिक्त हैं, वे वर्ण स्तंभ नहीं हैं, तृतीय वर्ण स्तंभ पर सॉर्ट करने के लिए, वाक्यविन्यास होगा sort -k 1.3,1.3:। ls -l | sort -k5,5nआकार पर सॉर्ट करने के लिए।
स्टीफन चेजलस

awkसमाधान वास्तव में क्या मैं आसानी से जटिल सॉर्टिंग आवश्यकताओं फिट करने के लिए संशोधित needed-- है
jchook

2
sort -g -k column_number 

विशिष्ट कॉलम का उपयोग करके किसी भी सूची को सांख्यिक वर्णों को क्रमबद्ध करने का सही आदेश है


1
का उपयोग करना -k बहुत अच्छी तरह से पहले से ही कवर किया गया था इसलिए यह उपयोगी होगा यदि आपने समझाया कि यह कमांड अलग या बेहतर कैसे है। शायद आप ओपी के वास्तविक प्रश्न को संबोधित करने के लिए वास्तविक कॉलम संख्या भी शामिल कर सकते हैं।
जेफ स्कालर

यह मुझे मैन पेजों का उपयोग करने के लिए मिला: p "-g, --general-संख्यात्मक-सॉर्ट, सामान्य संख्यात्मक मान के अनुसार तुलना करें" जो मुझे अपने मामले में चाहिए था।
जॉल्स


0
$ sort -k 1.3,1.3 myfile

यदि आपकी फ़ाइल में कोई विभाजक नहीं है, तो अपनी कॉलम फाइल को तीसरे कॉलम पर सॉर्ट करें।

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

मैन पेज ऑफ़ सॉर्ट:

[...] -k, --key = POS1 [, POS2] POS1 (मूल 1) पर एक कुंजी शुरू करें, इसे POS2 (पंक्ति का डिफ़ॉल्ट अंत) [...] POS F [.C] पर समाप्त करें। ओपीटीएस], जहां एफ क्षेत्र संख्या और सी क्षेत्र में चरित्र की स्थिति है; दोनों मूल हैं 1. यदि न तो-न तो -बी प्रभाव में है, तो एक क्षेत्र में वर्ण पूर्ववर्ती व्हाट्सएप की शुरुआत से गिने जाते हैं। ओपीटीएस एक या एक से अधिक अक्षरों का आदेश देने वाला विकल्प है, जो उस कुंजी के लिए वैश्विक ऑर्डरिंग विकल्पों को ओवरराइड करता है। यदि कोई कुंजी नहीं दी गई है, तो कुंजी के रूप में पूरी पंक्ति का उपयोग करें।

--Key = 1.3,1.3 के साथ, आपने कहा कि केवल एक फ़ील्ड (संपूर्ण पंक्ति) है और आप इस फ़ील्ड की तीसरी वर्ण स्थिति की तुलना कर रहे हैं।

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