Vi তে সদৃশ সারিগুলি সরানো হচ্ছে?


122

আমার কাছে একটি পাঠ্য ফাইল রয়েছে যাতে প্রবেশের দীর্ঘ তালিকা রয়েছে (প্রতিটি লাইনে একটি)। এর কয়েকটি হ'ল সদৃশ, এবং আমি জানতে চাই যে কোনও নকল অপসারণ করা সম্ভব কিনা (এবং যদি তা হয় তবে)। আমি সম্ভব হলে vi / vim এর মধ্যে থেকে এটি করতে আগ্রহী।



4
এই এক বছর বয়সী; যে এক 10 মাস। সুতরাং, অন্য উপায় কাছাকাছি।
সিডিয়াস

@ সায়দিয়াস sensক্যমত্য এখন আপোভোট গণনাটিকে অগ্রাধিকার দেবে (যা আপনার আরও বেশি রয়েছে): মেটা.স্ট্যাকেক্সেঞ্জ / বিকিউশনস / ১৪7643৩/২ এবং সেগুলি সদৃশ নয়, যে কোনও
ভিমের

উত্তর:


268

আপনি যদি নিজের ফাইলটি বাছাই করে ঠিক করেন তবে আপনি এটি ব্যবহার করতে পারেন:

:sort u

6
এটি খুব সুন্দর। ধন্যবাদ!
শ্রায়াস

8
যদি বাছাই অগ্রহণযোগ্য :%!uniqহয় তবে কেবল ফাইলটি বাছাই না করে ডুপ্লিকেট এন্ট্রিগুলি সরাতে ব্যবহার করুন।
cryptic0

আপনি একবার কমান্ড ব্যবহার করলে পুরো ফাইলের পরিবর্তন হয়? তুমি কীভাবে ফিরে যাবে? আমি ইতিমধ্যে ভুল করে ফাইলটি সংরক্ষণ করেছি ... আমার খারাপ
নিলন


25

এটা চেষ্টা কর:

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

এটি তত্ক্ষণাত যেকোন লাইন অনুসন্ধান করে তারপরে নিজের এক বা একাধিক অনুলিপি অনুসন্ধান করে এবং এটি একটি একক অনুলিপি দ্বারা প্রতিস্থাপন করে।

আপনার ফাইলটি চেষ্টা করার আগে একটি অনুলিপি তৈরি করুন। এটি অনির্ধারিত।


1
@ হ্যাপি আমার জন্য এটি পরীক্ষা করার জন্য ধন্যবাদ। আমার কাছে তখন ভিমে অ্যাক্সেস ছিল না।
শন

2
এটি আমার জন্য সমস্ত অনুলিপি লাইনগুলি হাইটলাইটগুলি মুছে দেয় না তবে মুছে ফেলা হয় না, আমি কি এখানে একটি পদক্ষেপ মিস করছি?
ak85

আমি নিশ্চিত যে এটি একই "উপসর্গ" রয়েছে তবে দীর্ঘতর একটি রেখার পরে একটি লাইনও হাইলাইট করবে।
হিপ্পিট্রেইল

3
এটির সাথে একমাত্র সমস্যাটি হ'ল যদি আপনার একাধিক সদৃশ থাকে (একই লাইনের 3 বা তার বেশি), সমস্ত ডুপগুলি চলে না যাওয়া পর্যন্ত আপনাকে এগুলি বহুবার চালাতে হবে কারণ এটি কেবল একবারে তাদের এক সেট ডুপ সরিয়ে দেয়।
হোর্টা

2
এর আর একটি অপূর্ণতা: আপনার সদৃশ লাইনগুলি ইতিমধ্যে একে অপরের পাশে না থাকলে এটি কাজ করবে না। প্রথমে বাছাই করা একে অপরের পাশে থাকা নিশ্চিত করার এক উপায় way এই মুহুর্তে, অন্য উত্তরগুলি সম্ভবত আরও ভাল।
হোর্টা

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
হ্যাঁ - আমি এই প্রযুক্তিটি একটি ২.৩ জিবি ফাইলে চেষ্টা করেছিলাম, এবং এটি হতবাকভাবে দ্রুত হয়েছিল।
ড্যানএম

আপনি কি উইন্ডোজ পিসিতে আছেন? আপনি সাইগউইন ব্যবহার করতে পারেন।
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

যাদের বাছাইয়ের দরকার নেই তাদের পক্ষে এটি সর্বোত্তম উত্তর হবে। এবং যদি আপনি উইন্ডোজ ব্যবহারকারী হন তবে সাইগউইন বা এমএসওয়াইএস চেষ্টা করে দেখুন।
fx-kirin

1

ইউনিকে কীভাবে ভিএমএলে কার্যকর করা যায় সে সম্পর্কে, ইউনিকের জন্য যে প্লাগইনটি আমি বজায় রাখছি তাতে সন্ধান করুন । এটি কার্যকর করার বিভিন্ন উপায় আপনি দেখতে পাবেন যা ভিম মেলিং-তালিকায় দেওয়া হয়েছিল।

অন্যথায়, :sort uসত্যিই যেতে উপায়।


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

অথবা

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

এটি আপনার জন্য আমার উত্তর, এটি একাধিক সদৃশ লাইনগুলি সরিয়ে ফেলতে পারে এবং কেবল একটিটিকে অপসারণ না করে রাখতে পারে!


0

আমি ব্যবহার করব !}uniq, তবে খালি লাইন না থাকলে কেবল এটিই কাজ করে।

একটি ফাইল ব্যবহারে যে লাইন জন্য: :1,$!uniq


0

এই সংস্করণটি কেবল পুনরাবৃত্ত রেখাগুলি সরিয়ে দেয় যা মীমাংসা হয়। মানে, কেবল পরপর পুনরাবৃত্তি করা লাইনগুলি মুছে দেয়। প্রদত্ত মানচিত্রটি ব্যবহার করে ফাংশনটি ফাঁকা রেখাগুলির সাথে নষ্ট করবে। তবে লাইনের শুরুতে ম্যাচগুলিতে আরজিইএক্সএক্স পরিবর্তন করা হলে ^এটি নকল খালি লাইনগুলিও সরিয়ে ফেলবে।

" 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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.