আপনি জিএনইউ diff
আউটপুটে পুরানো / নতুন / অপরিবর্তিত লাইনের বিন্যাস নিয়ন্ত্রণ করে এটি অর্জন করতে পারেন :
diff --new-line-format="" --unchanged-line-format="" file1 file2
এটি কাজ করার জন্য ইনপুট ফাইলগুলি বাছাই করা উচিত । সঙ্গে bash
(এবং zsh
) আপনি ইন-জায়গা প্রক্রিয়া প্রতিকল্পন সঙ্গে সাজাতে পারেন <( )
:
diff --new-line-format="" --unchanged-line-format="" <(sort file1) <(sort file2)
উপরের নতুন এবং অপরিবর্তিত রেখাগুলি দমন করা হয়, সুতরাং কেবল পরিবর্তিত (যেমন আপনার ক্ষেত্রে সরানো রেখাগুলি) আউটপুট। এছাড়াও আপনি একটি কয়েক ব্যবহার করতে পারেন diff
বিকল্প অন্যান্য সমাধানের প্রস্তাব না, যেমন -i
মামলা, বা বিভিন্ন হোয়াইটস্পেস অপশন (এড়িয়ে যেতে -E
, -b
, -v
ইত্যাদি) কম কঠোর মিলের জন্য।
ব্যাখ্যা
অপশন --new-line-format
, --old-line-format
এবং --unchanged-line-format
আপনি নিয়ন্ত্রণ পথ দিন diff
পার্থক্য, অনুরূপ ফরম্যাট printf
বিন্যাস নির্দিষ্টকরী। এই বিকল্পগুলি যথাক্রমে নতুন (যুক্ত), পুরানো (সরানো) এবং অপরিবর্তিত রেখাগুলি বিন্যাস করে। একটিকে খালি সেট করা "" ধরণের লাইনের আউটপুট আটকায়।
আপনি যদি ইউনিফাইড ডিফার্ট ফর্ম্যাটটির সাথে পরিচিত হন তবে আপনি এটি সহ আংশিকভাবে এটি আবার তৈরি করতে পারেন:
diff --old-line-format="-%L" --unchanged-line-format=" %L" \
--new-line-format="+%L" file1 file2
%L
সুনির্দিষ্টভাবে উল্লেখ করা প্রশ্নে লাইন, এবং আমরা সঙ্গে "+ +" "প্রতিটি পূর্বে ভী -" বা "", মত diff -u
(নোট যে এটি শুধুমাত্র আউটপুট পার্থক্য, এটা অভাব আছে ---
+++
এবং @@
লাইন প্রতিটি দলবদ্ধ পরিবর্তন উপরের)। আপনি প্রতিটি লাইনের সাথে সংখ্যার মতো অন্যান্য দরকারী জিনিসগুলি করতেও এটি ব্যবহার করতে পারেন %dn
।
diff
পদ্ধতি (অন্যান্য পরামর্শের সঙ্গে বরাবর comm
এবং join
) শুধুমাত্র সঙ্গে প্রত্যাশিত আউটপুট উত্পাদন সাজানো , ইনপুট যদিও আপনি ব্যবহার করতে পারেন <(sort ...)
জায়গায় সাজাতে হয়। এখানে একটি সাধারণ awk
(নওক) স্ক্রিপ্ট (কনসোলবক্সের উত্তরে লিঙ্কযুক্ত লিপিগুলি দ্বারা অনুপ্রাণিত) যা নির্বিচারে আদেশ করা ইনপুট ফাইলগুলি গ্রহণ করে এবং ফাইল 1-এ প্রদর্শিত ক্রমটি অনুপস্থিত রেখাগুলি আউটপুট দেয়।
# output lines in file1 that are not in file2
BEGIN { FS="" } # preserve whitespace
(NR==FNR) { ll1[FNR]=$0; nl1=FNR; } # file1, index by lineno
(NR!=FNR) { ss2[$0]++; } # file2, index by string
END {
for (ll=1; ll<=nl1; ll++) if (!(ll1[ll] in ss2)) print ll1[ll]
}
এটি লাইন-সংখ্যা সূচিকৃত অ্যারেতে লাইন দিয়ে ফাইল 1 লাইনের ll1[]
সম্পূর্ণ সামগ্রী এবং লাইন-কন্টেন্ট ইনডেক্সড এসোসিয়েটিভ অ্যারে লাইনে ফাইল 2 লাইনের সম্পূর্ণ সামগ্রী সংরক্ষণ করে ss2[]
। উভয় ফাইল পড়ার পরে, পুনরাবৃত্তি হবে ll1
এবং ফাইল 1- in
এ লাইনটি ফাইল 2 এ উপস্থিত রয়েছে কিনা তা নির্ধারণ করতে অপারেটরটি ব্যবহার করুন । ( diff
ডুপ্লিকেট থাকলে এর পদ্ধতিতে আলাদা আলাদা আউটপুট থাকবে ))
ফাইলগুলি যথেষ্ট পরিমাণে বড় হয়ে থাকে যেগুলি উভয় স্টোর করে রাখার ফলে উভয়ই মেমোরি সমস্যার সৃষ্টি করে, আপনি কেবল ফাইল 1 সংরক্ষণ করে এবং ফাইল 2 পড়ার পথে ম্যাচগুলি মুছে ফেলে মেমরির জন্য সিপিইউ বাণিজ্য করতে পারেন।
BEGIN { FS="" }
(NR==FNR) { # file1, index by lineno and string
ll1[FNR]=$0; ss1[$0]=FNR; nl1=FNR;
}
(NR!=FNR) { # file2
if ($0 in ss1) { delete ll1[ss1[$0]]; delete ss1[$0]; }
}
END {
for (ll=1; ll<=nl1; ll++) if (ll in ll1) print ll1[ll]
}
উপরের দুটি ফাইল অ্যারের মধ্যে ফাইল 1 এর সম্পূর্ণ বিষয়বস্তু সংরক্ষণ করে, একটি লাইন নম্বর ll1[]
দ্বারা সূচিত, একটি লাইন সামগ্রী দ্বারা সূচিত ss1[]
। তারপরে ফাইল 2 পড়ার সাথে সাথে প্রতিটি মিলের লাইনটি মুছে ফেলা হয় ll1[]
এবং থেকে ss1[]
। ফাইল 1 থেকে বাকি লাইনগুলি আউটপুট, মূল ক্রম সংরক্ষণ করে।
এক্ষেত্রে সমস্যা হিসাবে যেমন বলা হয়েছে, আপনি জিএনইউ (ফিল্টারিং একটি জিএনইউ এক্সটেনশন) ব্যবহার করে বিভাজন এবং বিজয় অর্জন করতে পারেন split
, ফাইল 1 এর খণ্ডগুলি এবং বারবার সম্পূর্ণ ফাইল 2 পড়া নিয়ে বারবার রান করা:
split -l 20000 --filter='gawk -f linesnotin.awk - file2' < file1
উল্লেখ্য ব্যবহার এবং বসানো -
মানে stdin
উপর gawk
কমান্ড লাইন। এটি split
প্রতি-অনুরোধে 20000 লাইনের অংশগুলিতে ফাইল 1 থেকে সরবরাহ করা হয় ।
অ গনুহ সিস্টেমে ব্যবহারকারীদের জন্য, আছে প্রায় অবশ্যই একটি গনুহ coreutils প্যাকেজ আপনি পেতে পারেন অংশ হিসেবে উপর ওএসএক্স সহ, অ্যাপল Xcode সরঞ্জাম যা গনুহ প্রদান করে diff
, awk
যদিও শুধুমাত্র একটি POSIX / বাসদ split
বদলে গনুহ সংস্করণ।
awk 'NR==FNR{a[$0];next}!($0 in a)' file2 file1 > out.txt