2008-12-08 12 views
87

मेरे पास एक टेक्स्ट फ़ाइल है जिसमें प्रविष्टियों की एक लंबी सूची (प्रत्येक पंक्ति पर एक) शामिल है। इनमें से कुछ डुप्लिकेट हैं, और मैं जानना चाहता हूं कि यह संभव है (और यदि ऐसा है, तो कैसे) किसी भी डुप्लीकेट को हटाने के लिए। यदि संभव हो तो मुझे vi/vim के भीतर ऐसा करने में दिलचस्पी है।vi में डुप्लिकेट पंक्तियों को हटा रहा है?

+1

http://stackoverflow.com/questions/746689/unix-tool-to-remove-duplicate-lines-from-a-file –

+3

का डुप्लिकेट जैसा दिखता है यह 1 वर्ष पुराना है; वह 10 महीने है। तो, चारों ओर दूसरी तरफ। – Sydius

+0

@ साइडियस सर्वसम्मति अब अपवोट गिनती को प्राथमिकता देना है (जिसमें आपके पास भी अधिक है): http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even यद्यपि-यह-बहुत-नया-और-हा है और वे डुप्लिकेट नहीं हैं, उनमें से कोई भी विम का उल्लेख नहीं करता है :-) –

उत्तर

179

आप अपनी फ़ाइल छँटाई के साथ ठीक कर रहे हैं, तो आप उपयोग कर सकते हैं:

:sort u 
+1

छंटनी स्वीकार्य है, और इसने समस्या को हल किया। धन्यवाद! – Sydius

+1

यह बहुत सुंदर है। धन्यवाद! – Shrayas

+0

अगर सॉर्टिंग अस्वीकार्य है, तो फाइल को सॉर्ट किए बिना डुप्लिकेट प्रविष्टियों को हटाने के लिए '':%! Uniq'' का उपयोग करें। – cryptic0

20

इस प्रयास करें:
:%s/^\(.*\)\n\1$/\1/

हालांकि इससे पहले कि आप कोशिश एक कॉपी बनाएं। यह अवांछित है।

+7

यह काम करता है। अगली बार, इसका परीक्षण करें! – hop

+1

@hop मेरे लिए इसका परीक्षण करने के लिए धन्यवाद। उस समय मुझे विम तक पहुंच नहीं थी। – Sean

+2

यह मेरे लिए सभी डुप्लिकेट लाइनों को हाइटलाइट करता है लेकिन हटा नहीं जाता है, क्या मुझे यहां एक कदम याद आ रहा है? – ak85

1

दृश्य ऑनलाइन मोड (शिफ्ट + वी), तो :!uniq में लाइनों का चयन करें। यह केवल डुप्लीकेट पकड़ लेगा जो एक के बाद एक आते हैं।

+1

बस यह ध्यान देने के लिए केवल यूनिक प्रोग्राम स्थापित किए गए कंप्यूटर पर काम करेगा यानी लिनक्स, मैक, फ्रीब्स आदि – anteatersa

+0

यह उन लोगों के लिए सबसे अच्छा जवाब होगा जिन्हें सॉर्टिंग की आवश्यकता नहीं है। और यदि आप विंडोज उपयोगकर्ता हैं, तो सिगविन या एमएसवाईएस को आजमाने का विचार करें। –

0

मैं !}uniq का उपयोग करूंगा, लेकिन यह केवल तभी काम करता है जब कोई रिक्त रेखा न हो।

फ़ाइल उपयोग में प्रत्येक पंक्ति के लिए: :1,$!uniq

4

मैं ऊपर जवाब में से दो गठबंधन होगा: में मौजूद लाइनों की संख्या पर जांच करने के पहले और बाद में

go to head of file 
sort the whole file 
remove duplicate entries with uniq 

1G 
!Gsort 
1G 
!Guniq 

यदि आप कितने डुप्लिकेट लाइनों को हटा दिया गया देखने में रुचि रखते थे, का उपयोग नियंत्रण-जी अपने बफर।

+1

sort -u == sort | uniq –

+1

''uniq' को आंतरिक या बाहरी कमांड के रूप में पहचाना नहीं गया है, ऑपरेट करने योग्य प्रोग्राम या बैच फ़ाइल। – hippietrail

0

विमल में यूनिक को कैसे कार्यान्वित किया जा सकता है, इस बारे में plugin I'm maintaining में यूनिक की खोज करें। आप इसे लागू करने के विभिन्न तरीकों को देखेंगे जो कि विम मेलिंग-सूची पर दिए गए थे।

अन्यथा, :sort u वास्तव में जाने का तरीका है।

4
g/^\(.*\)$\n\1/d 

विंडोज़ पर मेरे लिए काम करता है। हालांकि लाइनों को पहले क्रमबद्ध किया जाना चाहिए।

+1

यह एक पंक्ति के बाद एक पंक्ति को हटा देगा जो उपसर्ग है: 'aaaa'' के बाद 'aaaabb'' aaaa हटा देगा गलती से – hippietrail

14

कमांड लाइन से बस करो:

sort file | uniq > file.new 
+0

यह एक विशाल फ़ाइल के लिए मेरे लिए बहुत आसान था। धन्यवाद! – Rafid

+0

काम के स्वीकार्य उत्तर को प्राप्त नहीं किया जा सका, क्योंकि 'मेरी तरह से' मेरी बड़ी फाइल पर लटका हुआ था। यह बहुत जल्दी और पूरी तरह से काम किया। धन्यवाद! – Tgsmith61591

+1

''uniq' को आंतरिक या बाहरी कमांड के रूप में पहचाना नहीं गया है, ऑपरेट करने योग्य प्रोग्राम या बैच फ़ाइल। – hippietrail

0
:%s/^\(.*\)\(\n\1\)\+$/\1/gec 

या

:%s/^\(.*\)\(\n\1\)\+$/\1/ge 

यह आपके लिए मेरा जवाब है, यह कई डुप्लिकेट लाइनों को हटा सकते हैं और केवल एक को दूर नहीं रख!

3

awk '!x[$0]++' yourfile.txt यदि आप आदेश को संरक्षित करना चाहते हैं (यानी, सॉर्टिंग स्वीकार्य नहीं है)। इसे vim से आमंत्रित करने के लिए, :! का उपयोग किया जा सकता है।

+1

यह सुंदर है! सॉर्ट करने की आवश्यकता नहीं है * बिल्कुल * जो मैं खोज रहा था! – Cometsong

संबंधित मुद्दे