किसी फ़ाइल के दूसरे कॉलम के आधार पर डेटा सॉर्ट करना


212

मेरे पास दो कॉलम और nपंक्तियों की संख्या की एक फाइल है ।

कॉलम 1 में शामिल है namesऔर कॉलम 2 है age

मैं age(दूसरे कॉलम में) के आधार पर इस फाइल की सामग्री को आरोही क्रम में क्रमबद्ध करना चाहता हूं ।

परिणाम nameके साथ सबसे कम उम्र के व्यक्ति को प्रदर्शित करना चाहिए nameऔर फिर दूसरा सबसे छोटा व्यक्ति और इसी तरह ...

एक लाइनर शेल या बैश स्क्रिप्ट के लिए कोई सुझाव।


1
सुपरसेट: कस्टम सीमांकक: stackoverflow.com/questions/1037365/…
Ciro Santilli 病 六四 del del 事件

जवाबों:


329

आप sortकमांड का उपयोग कर सकते हैं :

sort -k2 -n yourfile

-n, --numeric-sortस्ट्रिंग संख्यात्मक मूल्य के अनुसार तुलना करें

उदाहरण के लिए:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
यह भी ध्यान दें कि -hइसके बजाय का उपयोग -nमानव पठनीय मूल्यों की तरह 2Gया 3Kसाथ ही संख्याओं को अल्पविराम से अलग करेगा जैसे1,234.5
चिलिटोम

"गलत" आदेश के साथ समस्या का सामना करना पड़ा। आदमी पर ध्यान दें "*** चेतावनी *** पर्यावरण द्वारा निर्दिष्ट स्थान क्रम को प्रभावित करता है। LC_ALL=Cपारंपरिक प्रकार के आदेश को प्राप्त करने के लिए सेट करें जो मूल बाइट मानों का उपयोग करता है।" (बिना स्ट्रिंग मैच केस के -n)
x'ES

यह पहले कॉलम में रिक्त स्थान पर विचार नहीं करता है और न ही काम करता है यदि लाइन के अंत तक दूसरे के बाद से अधिक कॉलम हैं, तो -k पढ़ा जाता है। यह एक TSV फ़ाइल एक बेहतर समाधान है मान लीजिएsort -t$'\t' -k2 -n FILE
tuxErrante

आपको -t विकल्प का उपयोग करके अपना सीमांकक निर्दिष्ट करने की आवश्यकता हो सकती है
स्पेक्ट्रम

85

उपाय:

sort -k 2 -n filename

और अधिक के रूप में लिखा:

sort --key 2 --numeric-sort filename


उदाहरण:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

स्पष्टीकरण:

  • -k # - यह तर्क उस पहले कॉलम को निर्दिष्ट करता है जिसे सॉर्ट करने के लिए उपयोग किया जाएगा। (ध्यान दें कि यहां कॉलम को व्हॉट्सएप सीमांकित क्षेत्र के रूप में परिभाषित किया गया है; यह तर्क प्रत्येक पंक्ति में -k5पांचवें क्षेत्र से शुरू होगा , प्रत्येक पंक्ति में पांचवें वर्ण से नहीं )

  • -n - यह विकल्प एक "संख्यात्मक प्रकार" को निर्दिष्ट करता है जिसका अर्थ है कि पाठ के बजाय कॉलम को संख्याओं की एक पंक्ति के रूप में व्याख्या की जानी चाहिए।


अधिक:

अन्य सामान्य विकल्पों में शामिल हैं:

  • -r - यह विकल्प छँटाई क्रम को उलट देता है। इसे --reverse के रूप में भी लिखा जा सकता है ।
  • -i - यह विकल्प गैर-मुद्रण योग्य वर्णों की उपेक्षा करता है। इसे --ignore-nonprinting के रूप में भी लिखा जा सकता है ।
  • -b - यह विकल्प प्रमुख रिक्त स्थानों की उपेक्षा करता है, जो कि आसान है क्योंकि पंक्तियों की संख्या निर्धारित करने के लिए सफेद रिक्त स्थान का उपयोग किया जाता है। इसे --ignore-अग्रणी-ब्लैंक के रूप में भी लिखा जा सकता है ।
  • -f - यह विकल्प अक्षर के मामले की अनदेखी करता है। 'ए' == "एक"। इसे --ignore-case के रूप में भी लिखा जा सकता है ।
  • -t [नया विभाजक] - यह विकल्प प्रीप्रोसेसिंग को अंतरिक्ष के अलावा एक ऑपरेटर का उपयोग करता है। इसे --field-विभाजक के रूप में भी लिखा जा सकता है ।

अन्य विकल्प हैं, लेकिन ये सबसे आम और सहायक हैं, जिनका मैं अक्सर उपयोग करता हूं।


@Angelo इस उत्तर को संभवतः वर्षों बाद पोस्ट किया गया था जब आप इस प्रश्न का उत्तर स्वीकार कर लेते हैं, लेकिन क्या आपने इसे नया स्वीकृत उत्तर माना है?
जोनाथन वाई।

विकल्प -tवास्तविक जीवन रक्षक था !! जब आपके कॉलम में स्थान हो और कॉलम किसी दिए गए वर्ण द्वारा भिन्न हों जैसे कि ,या टैब
AKS

12

टैब से अलग किए गए मानों के लिए नीचे दिए गए कोड का उपयोग किया जा सकता है

sort -t$'\t' -k2 -n

-r का उपयोग अवरोही क्रम में डेटा प्राप्त करने के लिए किया जा सकता है।
संख्यात्मक प्रकार के लिए
-k, --key = POS1 [, POS2] जहां k फाइल में कॉलम है
नीचे दिए गए क्रम के लिए कोड है

sort -t$'\t' -k2 -rn

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