স্যুইচড লাইনের সাথে পৃথক দুটি ফাইলের ফলাফল বলছে একই লাইনে দু'বার অনুপস্থিত


28

আমি দুটি ফাইলের লিনাক্স ডিফ কমান্ডটি বোঝার চেষ্টা করছি যার লাইনগুলি কেবল একে অপরের অনুগমন কিন্তু এটি উত্পন্ন আউটপুটটি ছাঁটাতে সক্ষম নয়। নীচে তিনটি কমান্ড বিবেচনা করুন:

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples

কেউ কি উপরের ডিগ্রি থেকে উপরের ক্রিপ্টিক আউটপুট ব্যাখ্যা করতে পারে?

  1. আউটপুটে কেন "কমলা" এর কোনও উল্লেখ নেই?
  2. কী 1d0এবং 2a2এর অর্থ কি?

আমি এই উত্তর থেকে বুঝতে পারি যে:

"<" এর অর্থ লাইনটি ফাইল 2 এ অনুপস্থিত এবং ">" এর অর্থ লাইনটি ফাইল 1 এ অনুপস্থিত

কিন্তু এটি কেন ব্যাখ্যা করে না যে কেন কমলা আউটপুটটিতে অনুপস্থিত।


12
কারণ orangesদুটি ফাইলের মধ্যে বৃহত্তম সাধারণ অংশ, সুতরাং আপনি যা পান তা হ'ল দুটির মধ্যে পার্থক্য প্রকাশ করার সবচেয়ে সংক্ষিপ্ততম উপায়।
স্টাফেন চেজেলাস

10
এবং আপনি যদি আরও পঠনযোগ্য আউটপুট চান তবে কেবল diff -u file1 file2পরিবর্তে ব্যবহার করুন। এটিকে "ইউনিফাইড ডিফ" ফর্ম্যাট বলে। মূল ডিফ ফরমেটটি খুব কমপ্যাক্ট হতে বোঝানো হয়েছিল, তবে ইউনিফাইড ডিফগুলি আরও বেশি পাঠযোগ্য বলে বোঝানো হয়েছিল।
গডলিজিক

4
@godlygeek বাdiff -y file1 file2
ব্যবহারকারী 80551

উত্তর:


27

প্রতিবেদনটি বোঝার জন্য, মনে রাখবেন যে diffএটি প্রেসক্রিপটিভ, প্রথম ফাইলটি ( file1) এ দ্বিতীয় ফাইল ( file2) এর মতো করার জন্য কী পরিবর্তন করা দরকার তা বর্ণনা করে ।

বিশেষ করে, dএর মধ্যে 1d0উপায়ে মুছতে এবং a2a2অর্থ যোগ

এভাবে:

  • 1d0মানে লাইন 1 অবশ্যই file1( apples) -তে মুছে ফেলা উচিত । 0মধ্যে 1d0উপায়ে লাইন 0 যেখানে তারা দ্বিতীয় ফাইল (দেখা গেছে করবে file2) তারা কি মুছে ফেলা হয়েছে। এর অর্থ যখন (পিছন দিকে) পরিবর্তন file2করা হবে তখন লাইন 0 এর পরে file11 টি যুক্ত করুন ।file1file2
  • 2a2মানে দ্বিতীয় লাইনটি ( oranges) থেকে file2এখনকার দ্বিতীয় লাইনে যুক্ত করুন file1(প্রথম লাইনটি মুছে ফেলার পরে file1, orangesলাইন 1 এ পরিবর্তন করুন)

কি 0মধ্যে 1d0?
গিক

@ গিগ আমার সম্পাদনা দেখুন
বিশৃঙ্খলা

1
@ গীক তবে সাবধান হন, যা মস্তিষ্কে গিঁট দিতে পারে =)
বিশৃঙ্খলা

এটি আসলে নট তৈরি শুরু করেছে :-)
গীক

13

এই ফাইলগুলি বিবেচনা করুন:

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

এটি কীভাবে diffকাজ করে তা প্রদত্ত অর্ডার ভিত্তিক:

  1. diffএবং এর প্রথম লাইনের ব্লক পড়ে file1এবং file2সমান লাইনগুলি সন্ধান করার চেষ্টা করে:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
  2. এখন এটি উভয় ফাইলের সমান সমস্ত লাইন এড়িয়ে যাবে, যা কেবলমাত্র orangesএই ক্ষেত্রে:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
  3. এখন অনুরূপ লাইনের আরও একটি সেট খুঁজে নিন এবং পার্থক্যগুলি মুদ্রণ করুন:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
  4. অনুরূপ লাইনগুলি এড়িয়ে যান

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
  5. সম্ভব হলে অভিন্ন লাইনগুলি সন্ধান করুন এবং মুদ্রণ পার্থক্যগুলি:

    line_file1    file1    line_file2    file2        differences on left (<) or right side (>)
             1    apples                              <apples 
             2    pears                               <pears 
             3    oranges           1    oranges
                                    2    apples       >apples
             4    peaches           3    peaches
                                    4    ananas       >ananas
                                    5    banana       >banana
             -----------------------------------------------
    

এখন আমি যদি diff file1 file2:

# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana

diffএর আউটপুটটির অর্থ কী তা ব্যাখ্যা করা এখন সহজ :

করতে file1সমান file2:

  • 1,2d0: মুছুন ( d) লাইন 1-2থেকে file1এবং লাইন সংশোধন 0এর file2তদনুসারে
  • 3a2: পরিশেষে ( a) লাইন 3এর file1লাইন 2এরfile2
  • 4a4,5: পরিশেষে লাইন 4এর file1লাইন 4-5এরfile2

diffলাইন বাই লাইনের file1সাথে তুলনা file2করে এবং অস্থায়ী স্মৃতিতে পার্থক্যগুলি নিষ্পত্তি করে। একটি লাইনের প্রথম উপস্থিতি না হওয়া পর্যন্ত file1 সমান করার পরে , যা ঘটেও থাকে , ততক্ষণ পর্যন্ত সমান যে সমস্ত লাইন উল্লেখ করা হয় না, প্রায়শই নির্দেশিত হয় । এই ক্ষেত্রে একই মাত্র একটি লাইন আছে, যা । নোট করুন যে আমি সমান বলেছি , তাই অন্যদিকে নয় বরং তুলনামূলকভাবে দেখা হয়।file2file1file2---orangesfile1file2file1file2

এই ক্ষেত্রে আউটপুট প্রদত্ত প্রথম ফাইলের সাথে সম্পর্কিত file1


2
আমি প্রাথমিক ব্যাখ্যাটি পছন্দ করি না: applesউভয় ফাইলেও ঘটে।
বা ম্যাপার

1
@ ওরম্পার আমি ব্যাখ্যাটি পরিবর্তন করেছি। এটি কি আরও পরিষ্কার / আরও ভাল লাগছে :)?
পলিম

বেশ নয়, আপাতত আপনি লিখেছেন "এখানে একই ধরণের লাইন রয়েছে, যা oranges"। ভুল: আসলে দুটি লাইন রয়েছে, যা কেবল একই নয় , একেবারে অভিন্ন । তাদের একজন পড়ে oranges, অন্যজন পড়ে apples। এছাড়াও, আপনার ব্যাখ্যা (নিখুঁতভাবে অর্ডার-ভিত্তিক) প্রশ্ন (দৈর্ঘ্য-ভিত্তিক) সম্পর্কে স্টাফেনের মন্তব্যের সাথে বিরোধী - কে সঠিক?
বা ম্যাপার

@ ওরম্পার আপনি "এই ক্ষেত্রে" এবং তার আগে লাইনগুলি ভুলে গেছেন। আমি বোঝাতে চেয়েছিলাম এই পদক্ষেপে কেবল একই ধরণের লাইন রয়েছে। আমি আমার উত্তরে কেবল একটি উদাহরণ যুক্ত করব যাতে এটি আরও ভাল বোঝা যায়।
পোলিম

1
@ ওআরম্যাপার এছাড়াও আপনি কি আমাকে একটি উদাহরণ দিতে পারেন যা দেখায় যে দৈর্ঘ্য-ভিত্তিক উত্তর সঠিক?
পলিম

8

ওই যে তারা:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges

8

স্ট্যান্ডার্ড (পুরানো) আউটপুট ফর্ম্যাট ফাইলগুলির পার্থক্য রয়েছে এমন অঞ্চলগুলির সাথে পার্শ্ববর্তী পাঠ্য ছাড়াই ফাইলগুলির মধ্যে পার্থক্য প্রদর্শন করবে।

উদাহরণস্বরূপ: 1d0 <(মুছুন) এর অর্থ আপেলগুলির প্রথম লাইন থেকে অপসারণ করা দরকার file1, এবং 2a2 >(সংযোজন) মানে আপেলগুলিকেfile2 ২ য় লাইনে যুক্ত করা দরকার , যাতে উভয় ফাইলই মিলে যায়।

এখানে উপলব্ধ ডকুমেন্টেশন info diffআরও আরও ব্যাখ্যা করে:

প্রসঙ্গ ছাড়া পার্থক্য দেখানো হচ্ছে

"স্বাভাবিক" diffআউটপুট ফর্ম্যাটটি পার্শ্ববর্তী প্রসঙ্গ ছাড়াই প্রতিটি পার্থক্য দেখায়। কখনও কখনও এই জাতীয় আউটপুট হ'ল নিকটবর্তী অপরিবর্তিত রেখাগুলির গোলমাল ছাড়াই লাইনগুলি কীভাবে পরিবর্তিত হয়েছে তা দেখার সহজ উপায় (যদিও আপনি প্রসঙ্গের 0 টি লাইন ব্যবহার করে প্রসঙ্গের বা ইউনিফাইড বিন্যাসের সাথে একই ফলাফল পেতে পারেন)। তবে এই ফর্ম্যাটটি প্যাচগুলি প্রেরণের জন্য আর বহুল ব্যবহৃত হয় না; এই উদ্দেশ্যে, প্রসঙ্গ ফর্ম্যাট এবং ইউনিফাইড বিন্যাসটি সর্বোত্তম। পুরানো সংস্করণ diffএবং POSIX মানের সাথে সামঞ্জস্যের জন্য সাধারণ ফর্ম্যাটটি ডিফল্ট । --normalস্পষ্টভাবে এই আউটপুট ফর্ম্যাটটি নির্বাচন করতে বিকল্পটি ব্যবহার করুন ।

সাধারণ বিন্যাসের বিশদ বিবরণ

সাধারণ আউটপুট ফর্ম্যাটটিতে এক বা একাধিক পার্থক্য রয়েছে; প্রতিটি হুঙ্ক এমন একটি অঞ্চল দেখায় যেখানে ফাইলগুলি পৃথক হয়। সাধারণ ফর্ম্যাট কৃপণাগুলি এর মতো দেখতে:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

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

LaR প্রথম ফাইলের L এর পরে দ্বিতীয় ফাইলের রেঞ্জের রেখা যুক্ত করুন। উদাহরণস্বরূপ, 8a12,15ফাইল 1 এর লাইন 8 এর পরে ফাইল 2 এর 12-15 ফাইলগুলি যুক্ত করুন; বা, যদি ফাইল 2 কে ফাইল 1-এ পরিবর্তন করেন, 2 ফাইলের 12-15 লাইন মুছুন।

FcT প্রথম ফাইলের সীমার এফের রেখাগুলি দ্বিতীয় ফাইলের টিয়ের সীমার সাথে প্রতিস্থাপন করুন। এটি সম্মিলিত অ্যাড এবং মুছার মতো, তবে আরও কমপ্যাক্ট। উদাহরণস্বরূপ, 5,7c8,10ফাইল 2 এর 8-10 লাইন হিসাবে পড়তে ফাইল 1 এর লাইনগুলি 5-7 পরিবর্তন করুন; বা, যদি ফাইল 2 কে ফাইল 1 তে পরিবর্তন করা হয় তবে ফাইল 1 এর লাইন 5-7 হিসাবে পড়তে ফাইল 2 এর 8-10 টি পরিবর্তন করুন।

RdL প্রথম ফাইলটি থেকে রেঞ্জের রেখাগুলি মুছুন; লাইন এলটি যেখানে তারা মুছে ফেলা না হলে তারা দ্বিতীয় ফাইলটিতে উপস্থিত হত have উদাহরণস্বরূপ, 5,7d3মানে ফাইল 1 এর লাইনগুলি 5-7 মুছুন; বা, যদি ফাইল 2 কে ফাইল 1 তে পরিবর্তন করা হয় তবে ফাইল 2 এর লাইন 3 এর পরে ফাইল 1 এর লাইন 5-7 যুক্ত করুন।

আরো দেখুন:


কমলা দেখতে তাই আপনাকে পাশাপাশি বা একীভূত প্রসঙ্গটি ব্যবহার করে আলাদা করতে হবে।

উদাহরণে:

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.