Vi में डुप्लिकेट पंक्तियों को हटाना?


123

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


1
का डुप्लिकेट की तरह लग रहा stackoverflow.com/questions/746689/...
नाथन Fellman

4
यह एक 1 साल पुराना है; वह 10 महीने का है। इसलिए, अन्य तरीके से।
सेडियस

@ Sydius सर्वसम्मति अब upvote काउंट को प्राथमिकता देने के लिए है (जो आपके पास भी अधिक है): meta.stackexchange.com/questions/147643/… और वे डुप्लिकेट नहीं हैं, कि कोई
रिम का

जवाबों:


269

यदि आप अपनी फ़ाइल को सॉर्ट करने के साथ ठीक हैं, तो आप उपयोग कर सकते हैं:

:sort u

6
यह बहुत सुंदर है। धन्यवाद!
श्रेयस

8
यदि छांटना अस्वीकार्य है, :%!uniqतो फ़ाइल को सॉर्ट किए बिना केवल डुप्लिकेट प्रविष्टियों को हटाने के लिए उपयोग करें।
क्रिप्टोकरंसी

एक बार जब आप कमांड का उपयोग करते हैं तो पूरी फाइल बदल जाती है? तुम वापस कैसे जाते हो मैंने पहले ही फ़ाइल को गलती से बचा लिया ... मेरा बुरा
निलोन


25

इसे इस्तेमाल करे:

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

यह किसी भी लाइन को तुरंत खोजता है और उसके बाद खुद की एक या अधिक कॉपी करता है, और उसे एक ही कॉपी से बदल देता है।

अपनी फ़ाइल की एक प्रतिलिपि बनाएँ, हालांकि आप इसे आज़माने से पहले। यह अप्राप्त है।


1
@ मेरे लिए इसका परीक्षण करने के लिए धन्यवाद। मेरे पास उस समय नहीं था।
सीन

2
यह मेरे लिए सभी डुप्लिकेट लाइनों को हाईलाइट करता है, लेकिन हटाता नहीं है, क्या मैं यहां एक कदम याद कर रहा हूं?
23

मुझे पूरा यकीन है कि यह एक लाइन के बाद एक लाइन को भी हाइलाइट करेगा जिसमें समान "उपसर्ग" है, लेकिन लंबा है।
हिप्पिएट्रेल

3
इसके साथ एकमात्र मुद्दा यह है कि यदि आपके पास कई डुप्लिकेट हैं (समान पंक्तियों के 3 या अधिक), तो आपको इसे कई बार चलाना होगा जब तक कि सभी डुप्स नहीं चले जाते हैं क्योंकि यह केवल उन्हें एक बार में डंप के एक सेट को हटा देता है।
होर्ता

2
इसका एक और दोष यह है कि यह तब तक काम नहीं करेगा जब तक कि आपकी डुप्लिकेट लाइनें पहले से ही एक दूसरे के बगल में न हों। पहले छाँटना यह सुनिश्चित करने का एक तरीका होगा कि वे एक-दूसरे के बगल में हों। उस बिंदु पर, अन्य उत्तर शायद बेहतर हैं।
होर्ता

23

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

sort file | uniq > file.new

1
यह मेरे लिए बहुत बड़ी फ़ाइल के लिए बहुत उपयोगी था। धन्यवाद!
रफीद

1
काम करने के लिए स्वीकृत जवाब नहीं मिल सका, जैसा :sort uकि मेरी बड़ी फाइल पर लटका हुआ था। यह बहुत जल्दी और पूरी तरह से काम किया। धन्यवाद!
Tgsmith61591

1
'uniq' is not recognized as an internal or external command, operable program or batch file.
हिप्पिट्रैयल

1
हां - मैंने इस तकनीक को 2.3 जीबी फ़ाइल पर आज़माया, और यह चौंकाने वाला था।
दानाम

@hippietrail आप विंडोज़ पीसी पर हैं? शायद आप cygwin का उपयोग कर सकते हैं।
12431234123412341234123

8

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


4
ये बहुत प्यारी है! क्रमबद्ध करने की आवश्यकता नहीं है कि मैं क्या देख रहा था!
कॉमेटसॉन्ग

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

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


1
यह एक पंक्ति का अनुसरण करते हुए एक पंक्ति को हटा देगा जो कि यह उपसर्ग है: aaaaइसके बाद गलत तरीके aaaabbसे हटा देगा aaaa
हिप्पिट्रैएल

5

मैं ऊपर दिए गए दो उत्तरों को जोड़ूंगा:

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

1G
!Gsort
1G
!Guniq

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


1
'uniq' is not recognized as an internal or external command, operable program or batch file.
हिप्पिट्रैयल

3

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


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

यह उन लोगों के लिए सबसे अच्छा जवाब होगा जिन्हें छंटाई की आवश्यकता नहीं है। और अगर आप विंडोज़ यूजर हैं, तो Cygwin या MSYS ट्राई करें।
fx-kirin

1

Unimq को VimL में कैसे लागू किया जा सकता है, इस बारे में कि मैं एक प्लगइन में Uniq की खोज कर रहा हूँ । आप इसे लागू करने के विभिन्न तरीके देखेंगे जो विम मेलिंग-सूची में दिए गए थे।

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


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

या

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

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


0

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

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


0

यह संस्करण केवल उन दोहराई गई लाइनों को हटाता है जो संक्रामक हैं। मेरा मतलब है, केवल लगातार दोहराई गई लाइनों को हटाता है। दिए गए नक्शे का उपयोग करके फ़ंक्शन रिक्त लाइनों के साथ गड़बड़ करता है। लेकिन यदि रेखा के प्रारंभ से मिलान करने के लिए REGEX को बदल ^दें तो यह डुप्लिकेट की गई रिक्त लाइनों को भी हटा देगा।

" function to delete duplicate lines
function! DelDuplicatedLines()
    while getline(".") == getline(line(".") - 1)
        exec 'norm! ddk'
    endwhile
    while getline(".") == getline(line(".") + 1)
        exec 'norm! dd'
    endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>

0

एक वैकल्पिक विधि जो vi / vim (बहुत बड़ी फ़ाइलों के लिए) का उपयोग नहीं करती है, लिनक्स कमांड लाइन से सॉर्ट और यूनीक है:

sort {file-name} | uniq -u

0

इसने मेरे .csvऔर दोनों के लिए काम किया.txt

awk '!seen[$0]++' <filename> > <newFileName>

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

awk '!seen[$0]++' <filename>

>

<newFileName>

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