سؤال

لدي ملف نصي يحتوي على قائمة طويلة من الإدخالات (واحد في كل سطر).بعض هذه النسخ مكررة، وأود أن أعرف ما إذا كان من الممكن (وإذا كان الأمر كذلك، كيف) إزالة أي تكرارات.أنا مهتم بالقيام بذلك من داخل vi/vim، إن أمكن.

هل كانت مفيدة؟

المحلول

إذا كنت موافق مع فرز الملفات الخاصة بك، يمكنك استخدام:

:sort u

نصائح أخرى

وجرب هذا:

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

وانه يبحث عن أي خط تليها مباشرة نسخة أو أكثر من نفسها، ويستبدلها مع نسخة واحدة.

تأكد نسخة من الملف الخاص بك على الرغم من قبل أن تحاول ذلك. انها لم تختبر.

ومن سطر الأوامر فقط القيام به:

sort file | uniq > file.new

وawk '!x[$0]++' yourfile.txt إذا كنت ترغب في الحفاظ على النظام (أي الفرز أمر غير مقبول). من أجل الاحتجاج عليه من همة، :! يمكن استخدامها.

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

ويعمل بالنسبة لي على ويندوز. يجب فرز خطوط الأول بالرغم من ذلك.

وأود أن الجمع بين اثنين من الإجابات أعلاه:

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

1G
!Gsort
1G
!Guniq

إذا كنت ترغب في رؤية كيف تم إزالة العديد من خطوط مكررة، استخدام وسائل منع-G قبل وبعد للاطمئنان على عدد من خطوط الحالية في المخزن الخاص بك.

وحدد الخطوط في وضع خط البصرية ( التحول + ت )، ثم :!uniq. وهذا سوف التقاط فقط التكرارات التي تأتي واحدا تلو الآخر.

وفيما يتعلق كيف يمكن تنفيذها UNIQ في فيمل، والبحث عن UNIQ في <لأ href = "http://code.google.com/p/lh-vim/source/browse/system-tools/trunk/plugin/ system_utils.vim "يختلط =" نوفولو noreferrer "> المساعد أنا الحفاظ . سترى طرق مختلفة لتنفيذه التي اعطيت على فيم البريدية القائمة.

وعلى خلاف ذلك، :sort u هو في الواقع وسيلة للذهاب.

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

أو

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

وهذا هو جوابي لك، فإنه يمكن إزالة خطوط مكررة متعددة و تبقي فقط واحد تقم بإزالة!

وأود أن استخدام !}uniq، ولكن هذا لا تعمل إلا إذا كانت هناك أية أسطر فارغة.

لكل سطر في استخدام ملف: :1,$!uniq

وهذا الإصدار يزيل فقط خطوط المتكررة التي contigous. أعني، يحذف فقط خطوط المتكررة على التوالي. باستخدام خريطة بالنظر إلى وظيفة يفعل مذكرة خبط مع أسطر فارغة. ولكن إذا تغيير 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>

وهناك طريقة بديلة التي لا تستخدم السادس / همة (لملفات كبيرة جدا)، هو من سطر الأوامر لينكس استخدام نوع وUNIQ:

sort {file-name} | uniq -u

لقد نجح هذا بالنسبة لي لكليهما .csv و .txt

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

توضيح:يطبع الجزء الأول من الأمر صفوفًا فريدة والجزء الثاني أي.بعد السهم الأوسط لحفظ مخرجات الجزء الأول.

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

>

<newFileName>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top