2011-07-15 16 views
351

मान लीजिए मैं एक फ़ाइल निम्न के समान है:फ़ाइल में डुप्लिकेट लाइनें पाएं और गिनें कि प्रत्येक पंक्ति को कितनी बार डुप्लिकेट किया गया था?

123 
123 
234 
234 
123 
345 

मैं कितनी बार '123' दोहराया गया था, कितनी बार '234' दोहराया गया था, आदि तो आदर्श, उत्पादन प्राप्त करना चाहते हैं होगा जैसे:

sort <file> | uniq -c 

आप अधिक वर्बोज़उपयोग कर सकते हैं:

123 3 
234 2 
345 1 
+3

आप किस भाषा का उपयोग करना चाहते हैं? – VMAtm

उत्तर

544

मान लिया जाये कि प्रत्येक पंक्ति में एक संख्या हैझंडा भी जीएनयू संस्करण, जैसे, लिनक्स पर साथ:

sort <file> | uniq --count 
+1

यह वही है जो मैं करता हूं हालांकि एल्गोरिदमिक रूप से यह सबसे कुशल दृष्टिकोण नहीं है (ओ (एन लॉग एन) * avg_line_len जहां एन लाइनों की संख्या है)। मैं उन फ़ाइलों पर काम कर रहा हूं जो कई गीगाबाइट बड़े हैं, इसलिए प्रदर्शन एक महत्वपूर्ण मुद्दा है। मुझे आश्चर्य है कि कोई ऐसा उपकरण है जो एक उपसर्ग पेड़ (मेरे मामले में अक्सर आम उपसर्ग) या इसी तरह का उपयोग करके एक ही पास में गिनती करता है, जो ओ (एन) * avg_line_len में चाल करना चाहिए। क्या कोई ऐसे कमांडलाइन उपकरण को जानता है? – Droggl

+10

एक अतिरिक्त चरण उस के आउटपुट को अंतिम 'sort -n' कमांड में पाइप करना है। इससे परिणाम क्रमबद्ध होंगे जिससे लाइनें अक्सर होती हैं। – samoz

+19

यदि आप केवल डुप्लिकेट लाइनों को मुद्रित करना चाहते हैं, तो 'uniq -d' – DmitrySandalov

7

मान लिया जाये कि आप एक मानक यूनिक्स शेल और/या cygwin पर्यावरण तक पहुँच मिल गया है:

tr -s ' ' '\n' < yourfile | sort | uniq -d -c 
     ^--space char 

असल: सभी जगह वर्ण परिवर्तित लाइनब्रेक्स के लिए, फिर tranlsated आउटपुट सॉर्ट करें और फ़ीड करें कि uniq और डुप्लिकेट लाइनों की गिनती।

sort <files> | uniq -c | sort -nr 

या:

58

खोजने के लिए और एक से अधिक फ़ाइलों में डुप्लिकेट लाइनों गिनती के लिए, आप निम्न आदेश की कोशिश कर सकते

cat <files> | sort | uniq -c | sort -nr 
+7

+1 का उपयोग शीर्ष –

282

यह होगा प्रिंट डुप्लिकेट लाइनों केवल गिनती के साथ,:

sort FILE | uniq -cd 

या जीएनयू लंबे विकल्प (लिनक्स पर) के साथ:

sort FILE | uniq --count --repeated 

BSD and OSX you have to use grep पर अद्वितीय लाइनों को फिल्टर करने की:

sort FILE | uniq -c | grep -v '^ *1 ' 

दिया उदाहरण के लिए, परिणाम होगा:

3 123 
    2 234 

आप के लिए प्रिंट मायने रखता चाहते हैं सभी लाइनें जो केवल एक बार दिखाई देती हैं:

sort FILE | uniq -c 

या, जीएनयू लंबे विकल्प (लिनक्स पर) के साथ:

sort FILE | uniq --count 

दिए गए इनपुट के लिए, उत्पादन होता है:

3 123 
    2 234 
    1 345 

आदेश में तरह उत्पादन के लिए शीर्ष पर सबसे अधिक लगातार लाइनों के साथ, आप निम्न कार्य कर सकते हैं (सभी परिणाम प्राप्त करने के लिए):

sort FILE | uniq -c | sort -nr 

या, केवल लाइनों, सबसे अक्सर पहले नकल करने के लिए:

sort FILE | uniq -cd | sort -nr 
पर OSX

और बीएसडी अंतिम एक हो जाता है:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr 
+1

पर सबसे अधिक लगातार लाइनों को दिखाने के लिए करें - दोहराए गए या -d विकल्प के साथ अच्छा बिंदु। "| Grep 2" या इसी तरह के प्रयोग से कहीं अधिक सटीक! – Lauri

+0

मैं इस आदेश को उन सभी पंक्तियों को पुनर्प्राप्त करने के लिए कैसे संशोधित कर सकता हूं जिनकी पुनरावृत्ति गणना 100 से अधिक है? –

+0

@Black_Rider 'जोड़ना sort -n' या '| पाइप में sort -nr' पुनरावृत्ति गिनती (क्रमशः आरोही या अवरोही) द्वारा आउटपुट को सॉर्ट करेगा। यह वह नहीं है जो आप पूछ रहे हैं लेकिन मैंने सोचा कि इससे मदद मिल सकती है। – Andrea

19

वाया :

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data 

awk 'dups[$1]++' कमांड में, परिवर्तनीय $1 कॉलम 1 और स्क्वायर ब्रैकेट की पूरी सामग्री को सरणी एक्सेस प्रदान करता है। इसलिए, data फ़ाइल में लाइन के प्रत्येक 1 कॉलम के लिए, dups नामक सरणी का नोड बढ़ाया गया है।

और अंत में, हम num चर के रूप में साथ dups सरणी पर पाशन और बचाया संख्या पहले मुद्रित कर रहे हैं तो dups[num] द्वारा डुप्लिकेट किए गए मूल्य की उनकी संख्या।कि अपने इनपुट फ़ाइल कुछ लाइनों के अंत पर रिक्त स्थान है, यदि आप स्पष्ट उन, आप $0$1 के स्थान पर कमान में ऊपर :)

+1

क्या यह थोड़ा अधिक नहीं है क्योंकि हमारे पास 'uniq' है? –

+6

'सॉर्ट | uniq' और अजीब समाधान में काफी अलग प्रदर्शन और संसाधन व्यापार-बंद हैं: यदि फ़ाइलें बड़ी हैं और विभिन्न पंक्तियों की संख्या छोटी है, तो अजीब समाधान बहुत अधिक कुशल है। यह लाइनों की संख्या में रैखिक है और अंतरिक्ष उपयोग विभिन्न लाइनों की संख्या में रैखिक है। ओटीओएच, अजीब समाधान को स्मृति में सभी अलग-अलग लाइनों को रखने की आवश्यकता होती है, जबकि (जीएनयू) प्रकार अस्थायी फ़ाइलों का सहारा ले सकता है। –

7

"Windows PowerShell" का उपयोग मैं उपयोग कर सकते हैं खिड़कियों में

नोट आदेश नीचे उल्लेख इस्तेमाल किया इस

Get-Content .\file.txt | Group-Object | Select Name, Count 

प्राप्त करने के लिए इसके अलावा हम परिणाम

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count 
फिल्टर करने के लिए जहां-वस्तु cmdlet का उपयोग कर सकते हैं
+0

क्या आप अंतिम एक को छोड़कर डुप्लिकेट की सभी घटनाओं को हटा सकते हैं ... फ़ाइल के सॉर्ट ऑर्डर को बदले बिना? – jparram