केवल एक कॉलम द्वारा UNIX को कैसे सॉर्ट करें?


47

मुझे पता है कि यूनिक्स सॉर्ट के लिए -k विकल्प हमें एक विशिष्ट कॉलम और निम्नलिखित सभी के आधार पर सॉर्ट करने की अनुमति देता है । उदाहरण के लिए, इनपुट फ़ाइल दी गई है:

2 3
2 2
1 2
2 1
1 1

उपयोग करते हुए sort -n -k 1, मुझे 1 कॉलम और फिर 2 के आधार पर एक आउटपुट मिलता है:

1 1
1 2
2 1
2 2
2 3

हालाँकि, मैं 2 कॉलम कॉलम को इस तरह रखना चाहता हूं:

1 2
1 1
2 3
2 2
2 1

क्या यह sortआज्ञा से संभव है ?

जवाबों:


64

इसे आजमाइए:

sort -s -n -k 1,1

-sअक्षम 'अंतिम उपाय' छँटाई, जो सब कुछ है कि एक निर्दिष्ट कुंजी का हिस्सा नहीं था पर क्रमबद्ध करता है।

-k 1, नहीं वास्तव में मतलब है "इस क्षेत्र और निम्न में से सभी" सांख्यिक प्रकार के संदर्भ में करता है के रूप में आप अगर आप दूसरे स्तंभ पर सुलझाने की कोशिश देख सकते हैं। आप केवल शेष रेखा पर जाकर टूटे हुए संबंधों को देख रहे हैं। सामान्य तौर पर, हालांकि, आपको केवल एक क्षेत्र पर -k 1,1सॉर्ट करने के लिए निर्दिष्ट करने की आवश्यकता है।


तुम सही हो। मुझे ठीक इसी की आवश्यकता थी। धन्यवाद!

क्या इस तरह के आउटपुट में शामिल होना संभव है?
MiNdFrEaK

@MiNdFrEaK: आवश्यकता इस बात की joinहै कि जिस फ़ील्ड में आप शामिल हो रहे हैं उस पर इनपुट को सॉर्ट किया जाए। तो निश्चित रूप से, यह आउटपुट पहले फ़ील्ड पर सॉर्ट किया गया है, और आप इस पर शामिल हो सकते हैं।
Cascabel

मेरे पास 2 फाइलें हैं, जिसमें 2 कॉलम हैं, दूसरे में 1 कॉलम है। दूसरी फाइल को सॉर्ट करके उपयोग किया जाता है -u। अब कार्य मुझे पहली फ़ाइल के पहले कॉलम के साथ इस कॉलम में शामिल होने की आवश्यकता है, जिसे सॉर्ट नहीं किया गया है, इसलिए वाक्यविन्यास क्या होगा? यह काम करेगा? join -j 1 file2.txt sort -s -n -k 1 file1.txt?
MiNdFrEaK

1
-k 1,1( " , 1 " भाग) किसी भी बेहतर मेरे लिए काम नहीं करता। काम क्या है -s -k 1, -nअगर आपको इसकी आवश्यकता है।
टॉटर

10

केवल आपको जो पहला कॉलम करना चाहिए, उसे छाँटने के लिए:

sort -n -s -k1,1

से यूनिक्स और लिनक्स सिस्टम प्रशासन हैंडबुक

सॉर्ट मुख्य विनिर्देश -k3 (बजाय -k3,3) को स्वीकार करता है, लेकिन यह संभवतः वह नहीं करता है जो आप उम्मीद करते हैं। समाप्ति फ़ील्ड संख्या के बिना, पंक्ति के अंत में सॉर्ट कुंजी जारी रहती है


मेरे लिए काम नहीं कर रहा, मुझे -sविकल्प जोड़ने की जरूरत है क्योंकि कैस्केबेल ने बताया।
जीन पॉल

@JeanPaul आप सही हैं, के लिए दस्तावेज़ीकरण -sकहता है "यह विकल्प रिकॉर्ड के मूल रिकॉर्ड क्रम को बनाए रखता है जिसमें एक समान कुंजी होती है।"
tidbeck

2

प्रदान किए गए उत्तरों में से कोई भी मेरे लिए आम तौर पर काम नहीं करता है।

दोनों sort -s -k 2 file1और sort -n -k1,1इस फाइल के साथ अतिरिक्त छँटाई करते हैं:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

मुझे बस यह सटीक काम करना था और शेल लूप का उपयोग करके समाप्त करना था। यह समाधान बहुत बड़ी फ़ाइल पर अच्छी तरह से काम नहीं कर सकता है क्योंकि संपूर्ण फ़ाइल को सॉर्ट किए गए कॉलम में प्रत्येक अद्वितीय मान के लिए पढ़ने की आवश्यकता है।

यहां फ़ाइल को कॉलम 2 पर ही सॉर्ट किया गया है।

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

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