2012-11-27 13 views
5
1.gui Qxx 16 
    2.gu Qxy 23 
    3.guT QWS 18 
    4.gui Qxr 21 

मैं 3 कॉलम में एक मान आधार पर एक फ़ाइल क्रमबद्ध करना चाहते हैं, तो मैं का उपयोग करें:Bash- क्या लाइन के केवल एक कॉलम के लिए -uniq का उपयोग करना संभव है?

sort -rnk3 myfile 

2.gu Qxy 23 
4.gui Qxr 21 
3.guT QWS 18 
1.gui Qxx 16 

अब मैं उत्पादन करने के लिए है के रूप में: (लाइन 3.gui के साथ शुरू क्योंकि लाइन से बाहर है 4.gui के साथ एक अधिक से अधिक मूल्य)

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

मैं -head उपयोग नहीं कर सकते क्योंकि मैं पंक्तियों के लाखों लोगों की है है और मैं नहीं जहां कटौती करने के लिए करते हैं, मैं -uniq उपयोग करने के लिए एक तरह से समझ नहीं सका, क्योंकि यह के रूप में एक लाइन से व्यवहार करता है पूरा और जब से मैंनहीं बता सकतापहले कॉलम को देखने के लिए, यह उस रेखा की गणना करता है जिसने इसे अनूठा बनाया है - जो सामान्य है-। मुझे पता है -uniq पात्रों में से एक नंबर पर ध्यान न दें, लेकिन आप उदाहरण से देख सकते हैं पहले कॉलम विभिन्न वर्णों की संख्या हो सकता है के रूप में कर सकते हैं ..

कृपया सलाह ..

+0

संभव डुप्लिकेट ([वहाँ एक रास्ता है कॉलम के आधार पर 'uniq'? करने के लिए] http : //stackoverflow.com/questions/1915636/is-there-a-way-to-uniq-by-column) –

उत्तर

8

इस प्रयास करें:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++' 

awk को हटा दूसरे कॉलम के आधार पर डुप्लिकेट। डुप्लिकेट को हटाने के लिए यह वास्तव में एक प्रसिद्ध अजीब वाक्यविन्यास है। एक सरणी बनाए रखा जाता है जहां दूसरे क्षेत्र का रिकॉर्ड बनाए रखा जाता है। एक रिकॉर्ड से पहले हर बार मुद्रित किया जाता है, दूसरा क्षेत्र सरणी में चेक किया जाता है। यदि मौजूद नहीं है, तो यह मुद्रित है, अन्यथा यह डुप्लिकेट होने के बाद इसे छोड़ दिया गया है। यह ++ का उपयोग करके प्राप्त किया जाता है। पहली बार, जब एक रिकॉर्ड का सामना करना पड़ता है, तो यह ++ पोस्ट-फिक्स के बाद से 0 को गिनती रखेगा। बाद के अवसर उस मूल्य को बढ़ाएंगे जब अस्वीकार किया जाता है।

+0

@ गुरू .. क्या आप कमांड की व्याख्या करना चाहते हैं? – teutara

+1

@teutara: – Guru

+0

अपडेट किया गया - एक टन है। मुझे समझ में नहीं आया कि दूसरी पंक्ति (हैशिंग) का उपयोग क्यों करें .. – teutara

2

ये रहा:

sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }' 

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

यह awk का उपयोग करता है दूसरे क्षेत्र में डुप्लिकेट मानों की जाँच करने के जहां क्षेत्र विभाजक द्वारा या तो एक खाली स्थान या अवधि है। तो यह क्या यह के रूप में दूसरे क्षेत्र से व्यवहार करता है है:

$ awk -F'[. ]' '{ print $2 }' file 

gu 
gui 
guT 
gui 

awk में चर $0 पूरी लाइन का प्रतिनिधित्व करता है, $1 पहले क्षेत्र का प्रतिनिधित्व करता है, और इतने पर ..

awk -F'[. ]' '{ if (a[$2]++ == 0) print }'-F विकल्प आप स्पष्ट करने देते हैं क्षेत्र विभाजक, इस मामले में यह या तो सफेद जगह या अवधि है।

+0

हे @sudo_O .. फिर से धन्यवाद। क्या आप कृपया एक कमांड को कमांड की व्याख्या कर सकते हैं? – teutara

0

तो मैंने इसे सभी शक्तिशाली और अद्भुत Google - द्वारा पाया, मेरी छोटी लिपि @sudo_O के उत्तर को बंद करती है, जिसमें यह आपको सभी डुप्लिकेट लाइनें दिखाती है ...., डुप्लीकेट के बिना फ़ाइल नहीं।

पाठ मैं 3 स्तंभ (बंदरगाह) में सभी डुप्लिकेट खोजने गया था master.txt नामक एक फ़ाइल में थे

 
awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port 
do 
    grep $port master.txt 
done 
की