ফাইলের মাথা আলাদা


11

আমার দুটি ফাইল আছে আমার সন্দেহ, একটি ফাইল অন্যটির সাবসেট। ফাইলগুলিকে চিহ্নিত করার জন্য আলাদা করার কোনও উপায় আছে (সংযোগ পদ্ধতিতে) যেখানে প্রথম ফাইলটিতে দ্বিতীয় ফাইলটি ফিট হয়?


সম্পর্কিত: unix.stackexchange.com/questions/79135/...
SLM

আপনি কি বোঝাতে চেয়েছেন যে একটি ফাইলের লাইনগুলি অন্যটির একটি অনুচ্ছেদে, বা আসলে একটি সংলগ্ন সাবস্ট্রিং?
কাজ

একটি স্বতন্ত্র সাবস্ট্রিং, @ কাজ।
রিচার্ড

উত্তর:


14

diff -e bigger smaller কৌশলটি করবে, তবে কিছু ব্যাখ্যা দরকার, কারণ আউটপুটটি "বৈধ এডি স্ক্রিপ্ট"।

আমি দুটি ফাইল তৈরি করেছি, "বড়" এবং "ছোট", যেখানে "ছোট" এর বিষয়বস্তুগুলি "বড়" থেকে of ডিফ-বড় বড় "এর 5 থেকে 9 লাইনের সাথে সমান হয়:

% diff -e bigger smaller
10,15d
1,4d

যার অর্থ "বৃহত্তর" এর 10 থেকে 15 লাইনগুলি মুছুন এবং তারপরে 'আরও ছোট' পেতে 1 থেকে 4 লাইনগুলি মুছুন "। তার মানে "ছোট" হ'ল "বৃহত্তর" এর 9 থেকে 5 লাইন।

ফাইলের নামগুলি উল্টিয়ে দেওয়া আমার আরও জটিল কিছু হয়েছিল। যদি "ছোট" সত্যই "বড়" এর উপসেট গঠন করে তবে আউটপুটে কেবল 'ডি' (মুছে ফেলার জন্য) কমান্ড প্রদর্শিত হবে।


5

আপনি ঝাঁকুনির সাথে দৃশ্যমানভাবে এটি করতে পারেন । দুর্ভাগ্যক্রমে, এটি একটি জিইউআই সরঞ্জাম তবে আপনি যদি কেবল একবার এটি করতে চান এবং তুলনামূলকভাবে ছোট ফাইলটিতে এটি ঠিক করা উচিত:

নীচের চিত্রটি এর ফলাফল meld a b:

এখানে চিত্র বর্ণনা লিখুন


1
মাঠটি দুর্দান্ত, তবে এটি 100MB + ফাইলগুলির সাথে বেশ ভাল খেলছে না।
রিচার্ড

@ রিচার্ড এটি না এবং আমি যে কোনওভাবে একটি কমান্ড লাইন সরঞ্জাম পছন্দ করব, আমি কেবল ভেবেছিলাম এটি উল্লেখ করব।
টেরডন

অনেকটা দেখতে লাগে vimdiffযা টার্মিনালে পাওয়া যায়।
প্যাট্রিক

2

যদি ফাইলগুলি যথেষ্ট ছোট হয় তবে আপনি সেগুলি উভয় পার্লের স্লুর্প করতে পারেন এবং এর রেজেক্স ইঞ্জিনটি কৌশলটি করতে পারেন:

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সুইচ পার্ল নির্দেশ করে তার ইনপুট রেকর্ড বিভাজক সেট করতে $/গবগব করে খাওয়া ফাইল সম্পূর্ণরূপে হিসেবে তাই অনির্ধারিত মান।


1
কি করে 777? আমি নিলাম আপনি নাল পাস করছেন $/তবে কেন? এছাড়াও যেহেতু এগুলি কিন্ডো অ্যাসোস্টেরিক সুইচগুলি হয়, তাই ব্যাখ্যাটি পার্ল-নন-পারল লোকদের জন্য ভাল।
টেরডন

1
@ স্টারডন আমি সত্যিই পুরো ফাইল স্লাপ করতে এটি করছি। ব্যাখ্যা যুক্ত হয়েছে।
জোসেফ আর।

তবে কেন এটি প্রয়োজনীয়? $a=<$fh>যাইহোক ঠিক স্লাপ করা উচিত?
টেরডন

1
@terdon আমি জানি না, তা নয়। ডিফল্টরূপে $/সেট করা হয়েছে \nযাতে $a=<$fh>ফাইলটির কেবল একটি লাইনই $fhখোলে। অবশ্যই যদি না perlকমান্ড-লাইন আচরণের বিভিন্ন ডিফল্ট থাকে যা সম্পর্কে আমি অজানা?
জোসেফ আর।

আরগ, হ্যাঁ, আমার খারাপ, আমি কখনই ফাইলগুলি while $foo=<FILE>স্লাপ করি না বা আইডিয়োমটি ব্যবহার করি না যাতে আমি নিশ্চিত না হয়ে একটি (ভুল) পরীক্ষা চালাতাম যা কাজটি দেখে মনে হয়েছিল। কিছু মনে করো না :).
টেরডন

1

ফাইল টেক্সট ফাইল এবং হন 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

1

আপনার প্রশ্নটি "ফাইলগুলির প্রধান মাথা"। যদি আপনি সত্যিই বোঝাতে চান যে একটি ফাইলই অন্যটির প্রধান, তবে একটি সরল 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, তবে কিছুই মুদ্রিত হবে না। যদি কোনও ত্রুটি থাকে তবে প্রস্থান স্থিতি শূন্য নয়।

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