ইউনিক্স কমান্ড একটি ফাইলের দুটি লাইন একই কিনা তা পরীক্ষা করতে?


24

একটি ইউনিক্স কমান্ড আছে যা ফাইলের দুটি লাইন একই কিনা তা পরীক্ষা করতে পারে?

যেমন একটি ফাইল বিবেচনা করুন sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

আমরা বাক্যটি দেখতে পাই

This is sentence X

পুনরাবৃত্তি হয়

এমন কোনও আদেশ রয়েছে যা দ্রুত এটি সনাক্ত করতে পারে, যাতে আমি সম্ভবত এটির মতো এটি সম্পাদন করতে পারি -

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

উত্তর:


40

আপনি যে সঠিক ফলাফলটি সন্ধান করছেন তা পাওয়ার একটি উপায় এখানে রয়েছে:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

ব্যাখ্যা:

অভ্যন্তরীণ $(sort sentences.txt | uniq -d)প্রতিটি লাইন যা একাধিকবার ঘটে তার তালিকা করে। বাইরের এই লাইনের যে কোনওটির সাথে সঠিক মিলের জন্য grep -nFxআবার সন্ধান করে এবং তাদের লাইন নম্বরটি পুনরায় সংশোধন করেsentences.txt-x-F-n


আপনার সম্পাদনাটি ঠিক একই উত্তর পোস্ট করা থেকে আমাকে মারধর করেছে। +1
কেসী

সুতরাং $ (কমান্ড) সিনট্যাক্স এক ধরণের প্রতিস্থাপন হিসাবে কাজ করে?
কোডল্লু

2
@ কোডড ব্লু - হ্যাঁ একে কমান্ড সাবস্টিটিউশন
গ্রেবনেকে

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtকিছুটা দক্ষ হবে এবং সম্ভাব্য arg list too longসমস্যা এড়াতে হবে ।
স্টাফেন চেজেলাস

10

আপনি যা চান ঠিক তা নয়, তবে আপনি একত্রিত করার চেষ্টা করতে পারেন sortএবং uniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2লাইনটির জন্য এখানে পাওয়া নকল সংখ্যা, এখানে থেকে man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

যদি মেমরির সাথে ফাইলের বিষয়বস্তু ফিট হয় তবে awkএটি ভাল। Comp.lang.awk- র স্ট্যান্ডার্ড ওয়ান-লাইনার (আমি এই মেশিনটি থেকে কোনও উদাহরণ অনুসন্ধান করতে পারি না তবে প্রতি মাসে বেশ কয়েকটি আছে) কেবল সেখানে ডুপ্লিকেশন রয়েছে awk 'n[$0]++'যা প্রতিটি লাইনের মানের উপস্থিতি গণনা করে এবং যে কোনও ঘটনা (গুলি) মুদ্রণ করে প্রথমটি ব্যতীত অন্যটি, কারণ ডিফল্ট ক্রিয়া print $0

প্রথম সহ সমস্ত উপস্থিতি প্রদর্শন করতে, আপনার ফর্ম্যাটে, তবে সম্ভবত মিশ্র ক্রমে যখন একাধিক মান ডুপ্লিকেট করা হয়, তখন আরও কিছুটা চূড়ান্ত হয়:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

স্বচ্ছতার জন্য একাধিক লাইনে প্রদর্শিত, আপনি সাধারণত আসল ব্যবহারে একসাথে দৌড়েন। আপনি যদি প্রায়শই এটি করেন তবে আপনি awkকোনও ফাইলটিতে স্ক্রিপ্টটি রাখতে পারেন awk -f, বা অবশ্যই পুরো জিনিসটি শেল স্ক্রিপ্টে রাখতে পারেন। সর্বাধিক সাধারণের মতো awkএটি খুব একইভাবে করা যায় perl -n[a]

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