আমার দুটি ফাইল আছে আমার সন্দেহ, একটি ফাইল অন্যটির সাবসেট। ফাইলগুলিকে চিহ্নিত করার জন্য আলাদা করার কোনও উপায় আছে (সংযোগ পদ্ধতিতে) যেখানে প্রথম ফাইলটিতে দ্বিতীয় ফাইলটি ফিট হয়?
আমার দুটি ফাইল আছে আমার সন্দেহ, একটি ফাইল অন্যটির সাবসেট। ফাইলগুলিকে চিহ্নিত করার জন্য আলাদা করার কোনও উপায় আছে (সংযোগ পদ্ধতিতে) যেখানে প্রথম ফাইলটিতে দ্বিতীয় ফাইলটি ফিট হয়?
উত্তর:
diff -e bigger smaller
কৌশলটি করবে, তবে কিছু ব্যাখ্যা দরকার, কারণ আউটপুটটি "বৈধ এডি স্ক্রিপ্ট"।
আমি দুটি ফাইল তৈরি করেছি, "বড়" এবং "ছোট", যেখানে "ছোট" এর বিষয়বস্তুগুলি "বড়" থেকে of ডিফ-বড় বড় "এর 5 থেকে 9 লাইনের সাথে সমান হয়:
% diff -e bigger smaller
10,15d
1,4d
যার অর্থ "বৃহত্তর" এর 10 থেকে 15 লাইনগুলি মুছুন এবং তারপরে 'আরও ছোট' পেতে 1 থেকে 4 লাইনগুলি মুছুন "। তার মানে "ছোট" হ'ল "বৃহত্তর" এর 9 থেকে 5 লাইন।
ফাইলের নামগুলি উল্টিয়ে দেওয়া আমার আরও জটিল কিছু হয়েছিল। যদি "ছোট" সত্যই "বড়" এর উপসেট গঠন করে তবে আউটপুটে কেবল 'ডি' (মুছে ফেলার জন্য) কমান্ড প্রদর্শিত হবে।
আপনি ঝাঁকুনির সাথে দৃশ্যমানভাবে এটি করতে পারেন । দুর্ভাগ্যক্রমে, এটি একটি জিইউআই সরঞ্জাম তবে আপনি যদি কেবল একবার এটি করতে চান এবং তুলনামূলকভাবে ছোট ফাইলটিতে এটি ঠিক করা উচিত:
নীচের চিত্রটি এর ফলাফল meld a b
:
vimdiff
যা টার্মিনালে পাওয়া যায়।
যদি ফাইলগুলি যথেষ্ট ছোট হয় তবে আপনি সেগুলি উভয় পার্লের স্লুর্প করতে পারেন এবং এর রেজেক্স ইঞ্জিনটি কৌশলটি করতে পারেন:
perl -0777e '
open "$FILE1","<","file_1";
open "$FILE2","<","file_2";
$file_1 = <$FILE1>;
$file_2 = <$FILE2>;
print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
print " a subset of file_1\n";
'
-0777
সুইচ পার্ল নির্দেশ করে তার ইনপুট রেকর্ড বিভাজক সেট করতে $/
গবগব করে খাওয়া ফাইল সম্পূর্ণরূপে হিসেবে তাই অনির্ধারিত মান।
777
? আমি নিলাম আপনি নাল পাস করছেন $/
তবে কেন? এছাড়াও যেহেতু এগুলি কিন্ডো অ্যাসোস্টেরিক সুইচগুলি হয়, তাই ব্যাখ্যাটি পার্ল-নন-পারল লোকদের জন্য ভাল।
$a=<$fh>
যাইহোক ঠিক স্লাপ করা উচিত?
$/
সেট করা হয়েছে \n
যাতে $a=<$fh>
ফাইলটির কেবল একটি লাইনই $fh
খোলে। অবশ্যই যদি না perl
কমান্ড-লাইন আচরণের বিভিন্ন ডিফল্ট থাকে যা সম্পর্কে আমি অজানা?
while $foo=<FILE>
স্লাপ করি না বা আইডিয়োমটি ব্যবহার করি না যাতে আমি নিশ্চিত না হয়ে একটি (ভুল) পরীক্ষা চালাতাম যা কাজটি দেখে মনে হয়েছিল। কিছু মনে করো না :).
ফাইল টেক্সট ফাইল এবং হন smaller
, মধ্যে bigger
একটি লাইন শুরুতে শুরু তার সাথে বাস্তবায়ন খুব কঠিন নয় awk
:
awk -v i=0 'NR==FNR{l[n++]=$0;next}
{if ($0 == l[i]) {if (++i == n) {print FNR-n+1;exit}} else i=0}
' smaller bigger
আপনার প্রশ্নটি "ফাইলগুলির প্রধান মাথা"। যদি আপনি সত্যিই বোঝাতে চান যে একটি ফাইলই অন্যটির প্রধান, তবে একটি সরল cmp
আপনাকে জানাবে যে:
cmp big_file small_file
cmp: EOF on small_file
এটি আপনাকে বলে যে পড়ার সময় ফাইলের শেষের আগ পর্যন্ত দুটি ফাইলের মধ্যে একটি পার্থক্য সনাক্ত করা যায়নি small_file
।
তবে যদি আপনি বোঝাতে চান যে ছোট ফাইলের পুরো পাঠ্যটি যে কোনও জায়গায়ই ঘটতে পারে big_file
তবে ধরে নিই যে আপনি উভয় ফাইলই মেমরিতে ফিট করতে পারেন, আপনি ব্যবহার করতে পারেন
perl -le '
use autodie;
undef $/;
open SMALL, "<", "small_file";
open BIG, "<", "big_file";
$small = <SMALL>;
$big = <BIG>;
$pos = index $big, $small;
print $pos if $pos >= 0;
'
এটি big_file
যেখানে অফসেটস অন্তর্ভুক্ত রয়েছে সেখানে অফসেটটি মুদ্রণ করবে small_file
(উদাহরণস্বরূপ 0 টি যদি small_file
শুরুতে মেলে big_file
)। যদি small_file
ভিতরে মেলে না big_file
, তবে কিছুই মুদ্রিত হবে না। যদি কোনও ত্রুটি থাকে তবে প্রস্থান স্থিতি শূন্য নয়।