কীভাবে সাধারণগুলিতে লাইনগুলি দেখানো যায় (বিপরীত ভিন্ন)?


170

আমার কাছে একাধিক পাঠ্য ফাইল রয়েছে যার জন্য আমি লাইনগুলির মধ্যে ভিন্ন লাইনগুলির চেয়ে সাধারণভাবে লাইনগুলি জানতে চাই। কমান্ড লাইন ইউনিক্স বা উইন্ডোজ ঠিক আছে।

foo বিন্যাস:

linux-vdso.so.1 =>  (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)

দণ্ড:

libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 =>  (0x00007fffccffe000)

সুতরাং, পছন্দসই ইউটিলিটির আউটপুট উপরে এই দুটি ফাইল দেওয়া সমান হবে file1:line_number, file2:line_number == matching text (কেবলমাত্র একটি পরামর্শ, সিনট্যাক্সটি আসলে আমার যত্ন নেই):

foo:1, bar:3 == linux-vdso.so.1 =>  (0x00007fffccffe000)

ধন্যবাদ।


@ ক্রিসটফারশাল্টজ আমার ভুল 1 ম উদাহরণের 1 ম লাইনটি দ্বিতীয় উদাহরণে শেষ লাইনের সাথে মেলে। ভুল ধরার জন্য ধন্যবাদ; পরিবর্তন।
ম্যাট উইলকি

1
ভাল উত্তরের সাথে একই রকম আরেকটি প্রশ্ন: unix.stackexchange.com/questions/1079/…
মরটেজা

উত্তর:


210

* স্নো, আপনি ব্যবহার করতে পারেন Comm । প্রশ্নের উত্তরটি হ'ল:

comm -1 -2 file1.sorted file2.sorted 
# where file1 and file2 are sorted and piped into *.sorted

এখানে সম্পূর্ণ ব্যবহার রয়েছে comm:

comm [-1] [-2] [-3 ] file1 file2
-1 Suppress the output column of lines unique to file1.
-2 Suppress the output column of lines unique to file2.
-3 Suppress the output column of lines duplicated in file1 and file2. 

এছাড়াও নোট করুন যে কমপ ব্যবহার করার আগে ফাইলগুলি বাছাই করা গুরুত্বপূর্ণ, ম্যান পৃষ্ঠাগুলিতে উল্লিখিত হয়েছে।


3
কম [-1] [-2] [-3] ফাইল 1 ফাইল 2 -1 ফাইল 1 এর অনন্য লাইনের আউটপুট কলাম টিপুন। -2 ফাইল 2 এর জন্য স্বতন্ত্র লাইনের আউটপুট কলাম টিপুন। -3 ফাইল 1 এবং ফাইল 2-এ নকল করা লাইনের আউটপুট কলাম টিপুন।
ojblass

@ojblass: উত্তরে এটি যুক্ত হয়েছে Added
ম্যাট জে

6
আমি আবিষ্কার করেছি এটি কম ব্যবহারের আগে ফাইলগুলি বাছাই করা গুরুত্বপূর্ণ is সম্ভবত এটি উত্তরে যুক্ত করুন।
ম্যাট উইলকি

11
প্রশ্নের সংক্ষিপ্ত উত্তর: কম -1 -2 ফাইল 1 ফাইল
গ্রেগল

6
আপনার ফাইলগুলি বাছাই না করা হলে আপনি এটি ব্যবহার করতে পারেন: কম -1 -2 <(বাছাই করা ফাইলের নাম 1) <(সাজানো ফাইলের নাম 2)
কেভিন হুইলার

56

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

grep -F -x -f file1 file2

বা সরলীকৃত fgrep সংস্করণ

fgrep -xf file1 file2

এছাড়াও, আপনি file2*গ্লোব করতে ব্যবহার করতে পারেন এবং একাধিক ফাইলের সাথে মিল রেখে লাইনগুলি অনুসন্ধান করতে পারেন , কেবল দুটি না।

কিছু অন্যান্য সহজ প্রকরণ অন্তর্ভুক্ত

  • -n প্রতিটি মিলিত লাইনের লাইন নম্বরটি দেখানোর জন্য ফ্ল্যাগ করুন
  • -c কেবল মিলিত রেখার সংখ্যা গণনা করতে
  • -vপৃথক (বা ব্যবহার ) ফাইল 2 এ কেবল রেখাগুলি প্রদর্শন করতে diff

ব্যবহার commকরা দ্রুততর হয়, তবে সেই গতিটি প্রথমে আপনার ফাইলগুলি বাছাই করার ব্যয়ে আসে। এটি 'রিভার্স ডিফ' হিসাবে খুব কার্যকর নয়।


ধন্যবাদ রাইডার, এটি অনেকের কাছে কমের চেয়ে বেশি কার্যকর হতে পারে। আপনার উত্স উত্তরের সাথে লিঙ্ক করা উচিত (ডানদিকের নেভের কিউতে অর্ধ ডজনেরও বেশি সংযুক্ত রয়েছে; এটি খুঁজে পাওয়ার জন্য কিছুটা কাজ)। আন-বা ভিন্নভাবে বাছাই করা ইনপুট দিয়ে গ্রেপ কতটা ভাল করে তা জেনেও ভাল লাগবে এবং সম্পর্কিত লাইন সংখ্যাগুলি প্রিন্ট করতে পারে।
ম্যাট উইলকি

1
@ ম্যাটওয়িল্কি আমি -vনিজেই পিছলে যাওয়ার পরে পতাকাটি ফিরে আসার এবং স্পষ্ট করে দেওয়ার প্রয়োজনীয়তা অনুভব করেছি। বলুন যে আপনার কাছে দুটি সিএসভি ফাইল ফাইল 1 এবং ফাইল 2 রয়েছে এবং তাদের উভয়ই ওভারল্যাপিং এবং নন-ওভারল্যাপিং সারি রয়েছে। আপনি যদি সমস্ত এবং কেবল অ-ওভারল্যাপিং সারিগুলি চান fgrep -v file1 file2তবে কেবল ফাইল 2-এ নন-ওভারল্যাপিং সারিগুলি ফিরিয়ে আনবে, এবং ফাইল 1-এ অতিরিক্ত অ-ওভারল্যাপিং সারিগুলির কোনওটিই ফেরত পাবে না । এটি কারও কাছে সুস্পষ্ট হতে পারে তবে ঝুঁকির অপব্যাখ্যার চেয়ে সুস্পষ্ট কথা বলা ভাল। এই বিশেষ ক্ষেত্রে, ফাইলগুলি বাছাই করা এবং ব্যবহার commকরা আরও ভাল পছন্দ।
রাইডার

1
ফিরে এসে রাইডার স্পষ্ট করার জন্য আপনাকে ধন্যবাদ। অতিরিক্ত মনোযোগ লক্ষ করা যায় এবং প্রশংসা করা হয় (পুরানো জিনিসগুলি সরে যেতে দেওয়া সমস্ত t0o সহজ!)। আমি গ্রহণযোগ্য উত্তরটি পরিবর্তন করেছি কারণ কম স্পষ্টভাবে সম্প্রদায়ের পছন্দ, যদিও ব্যক্তিগতভাবে আমি এখনও এটি ব্যবহার করি যখন অযাচিত ওভারহেড বাছাই করা হয়।
ম্যাট উইলকি 18

2
ব্যবহার করার সময় আরেকটি জটিলতা grep: প্রথম ফাইলের কোনও ফাঁকা রেখা দ্বিতীয় ফাইলের প্রতিটি লাইনের সাথে মিলবে। নিশ্চিত file1হয়ে নিন যে কোনও ফাঁকা লাইন নেই, বা এটি ফাইলগুলি অভিন্ন বলে মনে হবে।
ক্রিস্টোফার শুল্টজ

grep -Fxfএটা আমার জন্য.
loxaxs

35

এখানে আগে জিজ্ঞাসা করা হয়েছিল: ইউনিক্স দুটি ফাইলে লাইন সাধারণ সন্ধান করার জন্য আদেশ দেয়

আপনি পার্ল দিয়েও চেষ্টা করতে পারেন (ক্রেডিট এখানে যায় )

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

1
ধন্যবাদ। পার্ল ওয়ান লাইনার ক্রস প্ল্যাটফর্ম হওয়ায় আমি উভয় উত্তর গ্রহণ করতে চাই। কম হ'ল অনুমোদন দেয় কারণ এটি সহজ।
ম্যাট উইলকি

1
পারফেক্ট। উইন্ডোতে সাইগউইন টার্মিনাল ব্যবহার করা এবং commতা সহজেই উপলব্ধ ছিল না। এটি ছিল নিখুঁত বিকল্প।
কিউস - মনিকা

3
এটি কীভাবে লাইনগুলি অর্ডার করা হয় সে সম্পর্কে কোনও চিন্তা করে না। এটা কম চেয়ে সঠিক।
enl8enmentnow

1
: একটি ব্যাখ্যা এখানে stackoverflow.com/questions/17552789/...
ক্রিস Koknat

17

আমি এই থ্রেডটি থেকে কম কম্যান্ডটি শিখেছি, তবে অতিরিক্ত কিছু যুক্ত করতে চেয়েছিলাম: যদি ফাইলগুলি সাজানো না হয় এবং আপনি মূল ফাইলগুলি স্পর্শ করতে না চান তবে আপনি বাছাই আদেশের আউটপুটটি পাইপ করতে পারেন। এটি মূল ফাইল অক্ষত রেখে দেয়। ব্যাশে কাজ করে, আমি অন্যান্য শেল সম্পর্কে বলতে পারি না।

comm -1 -2 <(sort file1) <(sort file2)

এটি ফাইলের পরিবর্তে কমান্ড আউটপুট তুলনা করতে বাড়ানো যেতে পারে:

comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)

9

করার সহজ উপায় হ'ল:

awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2

ফাইলগুলি বাছাই করার প্রয়োজন নেই।


1
এটি এখানে বেশিরভাগ উত্তরের মতো নয় যে এটি আপনাকে উত্স টেমপ্লেটগুলি পুনর্গঠন করতে দেয়। আমার কাছে একই মোড়ক থেকে দুটি ফাইল নির্মিত হয়েছে, কয়েকটি পয়েন্টে বিভিন্ন পাঠ্য textোকানো হয়েছে। এই উত্তরটি আমাকে মোড়কে পুনরুদ্ধার করতে সক্ষম করে।
লুকাস গঞ্জ 21

1

কেবল তথ্যের জন্য, আমি উইন্ডোজের জন্য "গ্রেপ-এফ-এক্স-ফাইফ ফাইল 1 ফাইল 2" এর চেয়ে একই কাজ করার জন্য একটি ছোট সরঞ্জাম তৈরি করেছি (যেহেতু আমি উইন্ডোজটিতে এই আদেশের সমতুল্য কিছু পাই নি)

এটি এখানে: http://www.nerdzcore.com/?page=commonlines

ব্যবহার হ'ল "কমনলাইন ইনপুট ফাইল 1 ইনপুট ফাইল 2 আউটপুট ফাইল"

উত্স কোডও উপলব্ধ (জিপিএল)


1

ইন উইন্ডোজ আপনি একটি ব্যবহার করতে পারেন PowerShell সঙ্গে স্ক্রিপ্ট CompareObject

compare-object -IncludeEqual -ExcludeDifferent -PassThru (get-content A.txt) (get-content B.txt)> MATCHING.txt | Out-Null #Find Matching Lines

CompareObject:

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