আমি কেবল যুক্ত এবং মুছে ফেলা লাইনগুলি দেখতে কীভাবে আলাদা হতে পারি? ডিফ যদি এটি করতে না পারে তবে কোন সরঞ্জামটি করতে পারে?


69

আমি কেবল যুক্ত এবং মুছে ফেলা লাইনগুলি দেখতে কীভাবে আলাদা হতে পারি? ডিফ যদি এটি করতে না পারে তবে কোন সরঞ্জামটি করতে পারে?


2
যুক্ত এবং মুছে ফেলার মাধ্যমে আপনার অর্থটি আপনাকে আরও ভালভাবে সংজ্ঞা দিতে হবে ine বিশেষত, একটি লাইন পরিবর্তন করতে পারেন? যদি তা হয় তবে আপনি কীভাবে পরিবর্তিত লাইনটি পরিচালনা করতে চান? আপনি যদি কঠোরভাবে লাইন ওরিয়েন্টেড চেকিং করেন, একটি লাইন পরিবর্তন পুরানো রেখাটি সরানো এবং নতুন লাইন যুক্ত হওয়ার অনুরূপ। উদাহরণস্বরূপ, এটি কীভাবে এমন একটি লাইন পরিচালনা করবে যা দুটি ভাগে বিভক্ত? দুটো 1 লাইন বদলে গেল? 2 লাইন পরিবর্তন হয়েছে? 1 লাইন সরানো এবং 2 লাইন যুক্ত? আপনি যদি গ্যারান্টি দিতে না পারেন যে লাইনগুলি কখনই পরিবর্তিত হবে না, কেবল যুক্ত এবং মুছে ফেলা হবে, আমি মনে করি এটি আরও ভাল সংজ্ঞা ছাড়াই ব্যর্থ হওয়ার জন্য বিনষ্ট হয়।
ক্রিস্টোফার ক্যাসেল

আমি প্রশ্নটি বেশ অস্পষ্ট মনে করি। তবে প্রশ্নের কমপক্ষে একটি ব্যাখ্যার উত্তর দেওয়া যেতে পারেdiff A B | grep '^[<>]'
কাস্পারড

আপনি খুঁজছেন হতে পারে comm
জেনি ডি

ক্রিস্টোফার ক্যাসেল, তার অর্থ সাজানোর ক্রম উপেক্ষা করুন; একটি সাধারণ সমস্যা সাধারণত এটি প্রথমে সাধারণ ডিফ করার আগে প্রতিটি পাশের অংশগুলি (রেখাগুলি) বাছাই করার মাধ্যমে করা হয়।
পেসিয়ার 4

@ পেসারিয়ার, আপনি কি এটি সম্পর্কে নিশ্চিত? নাকি আপনি অনুমান করছেন? বাছাই বা অনুসন্ধান আদেশ সম্পর্কে কিছুই প্রশ্নের উল্লেখ বা ইঙ্গিত দেওয়া হয় না। যেমনটি দাঁড়িয়েছে, প্রশ্নটি পরিষ্কার নয় এবং বিভিন্নভাবে ব্যাখ্যা করা যেতে পারে। তিনি কী জিজ্ঞাসা করছেন তা নিশ্চিতভাবে না জেনে আমরা অনুমান করাচ্ছি এবং এমন সমাধান সরবরাহ করছি যা প্রকৃত সমস্যাটি সমাধান করতে পারে বা নাও পারে। অধিকন্তু, উত্তরের একটিতে মূল পোস্টারের মন্তব্যটি বোঝায় যে এটি বাছাইয়ের সাথে সম্পর্কিত নয় । এটি "যুক্ত এবং মুছে ফেলা" বনাম "পরিবর্তিত" অর্থের সাথে সম্পর্কযুক্ত।
ক্রিস্টোফার ক্যাসেল

উত্তর:


81

কম চেষ্টা করুন

এটি দেখার আরেকটি উপায়:

  • কেবলমাত্র ফাইল ফাইলটিতে বিদ্যমান লাইনগুলি দেখান: (যেমনটি একটি থেকে মুছে ফেলা হয়েছে)

    comm -23 a b
    
  • কেবলমাত্র ফাইল বিতে বিদ্যমান লাইনগুলি দেখান: (যেমন বিটিতে কী যুক্ত হয়েছিল)

    comm -13 a b
    
  • কেবল একটি ফাইল বা অন্যটিতে বিদ্যমান লাইনগুলি দেখান: (তবে উভয়ই নয়)

    comm -3 a b | sed 's/^\t//'
    

(সতর্কতা: যদি ফাইলের aলাইন টিএব থেকে শুরু হয় তবে এটি (প্রথম টিএবি) আউটপুট থেকে সরানো হবে))

কেবল বাছাই করা ফাইল

দ্রষ্টব্য:comm সঠিকভাবে কাজ করার জন্য দুটি ফাইলই বাছাই করা দরকার । যদি সেগুলি ইতিমধ্যে বাছাই করা না থাকে তবে আপনার সেগুলি বাছাই করা উচিত:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

যদি ফাইলগুলি দীর্ঘ হয় তবে এটি অতিরিক্ত বোঝা হতে পারে কারণ এটির জন্য অতিরিক্ত অনুলিপি প্রয়োজন এবং তাই ডিস্কের দ্বিগুণ স্থান।


5
কেবলমাত্র যুক্ত করতে চেয়েছিলেন যে সঠিক ফলাফল আনতে এই ফাইলটির জন্য উভয় ফাইলই বাছাই করা উচিত (কেস সংবেদনশীল)
মারমর

আধুনিক পর্যাপ্ত শেলগুলির উপর, আপনি এর মতো কিছু দিয়ে comm -12 <(sort a) <(sort b)
জোশুয়া হুবার

14

commআপনি যা চান তা করতে পারে এর ম্যান পৃষ্ঠা থেকে:

বর্ণনা

বাছাই করা ফাইলগুলি FILE1 এবং FILE2 লাইন লাইন দিয়ে তুলনা করুন।

কোনও বিকল্প নেই, তিন-কলাম আউটপুট উত্পাদন। কলামের একটিতে FILE1 এর জন্য স্বতন্ত্র রেখাগুলি রয়েছে, কলাম দুটিতে FILE2 এর জন্য অনন্য লাইন রয়েছে এবং তিনটি কলামে উভয় ফাইলের জন্য সাধারণ লাইন রয়েছে।

এই কলাম সহ suppressable হয় -1, -2এবং -3যথাক্রমে।

উদাহরণ:

[root@dev ~]# cat a
common
shared
unique

[root@dev ~]# cat b
common
individual
shared

[root@dev ~]# comm -3 a b
    individual
unique

এবং যদি আপনি কেবল অনন্য লাইন চান এবং কোন ফাইলটিতে আছেন সেদিকে খেয়াল রাখবেন না:

[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique

ম্যান পেজ যেমন বলেছে, ফাইলগুলি অবশ্যই আগে সাজানো হবে।


9

প্রসঙ্গ, লাইন নম্বর, +, -, <,> ছাড়াই সংযোজন এবং মোছা দেখাতে! ইত্যাদি, আপনি এই জাতীয় মত ব্যবহার করতে পারেন:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

উদাহরণস্বরূপ, দুটি ফাইল দেওয়া:

a.txt

Common
Common
A-ONLY
Common

b.txt

Common
B-ONLY
Common
Common

নিম্নলিখিত কমান্ডটি একটি থেকে সরানো বা খ-তে যুক্ত লাইনগুলি প্রদর্শন করবে:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

আউটপুট:

B-ONLY
A-ONLY

এই সামান্য ভিন্ন কমান্ড a.txt থেকে সরানো লাইনগুলি দেখায়:

diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt 

আউটপুট:

A-ONLY

অবশেষে, এই কমান্ডটি a.txt এ যুক্ত লাইনগুলি প্রদর্শন করবে

diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt 

আউটপুট

B-ONLY

2

এটি ডিফল্টরূপে পৃথকভাবে কী ঘটে ... হোয়াইটস্পেস উপেক্ষা করার জন্য আপনাকে কিছু পতাকা যুক্ত করতে হবে?

diff -b -B

ফাঁকা লাইন এবং স্পেসের বিভিন্ন সংখ্যা উপেক্ষা করা উচিত।


1
না, এটি পরিবর্তিত রেখাগুলিও দেখায় (লাইনগুলির একটি চরিত্র বা চারটি পৃথক পৃথক রয়েছে)। আমি এমন লাইনগুলি চাই যা কেবলমাত্র বাম বা ডানদিকে থাকে।
সি রস

2
আপনি তর্ক করতে পারেন যে একটি পরিবর্তিত ফাইলের পৃথক সংস্করণগুলি প্রতিটি বাম বা ডানদিকেই বিদ্যমান।
মার্কড্রেটন

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

1
প্রযুক্তিগতভাবে, ডিফ একটি "পরিবর্তিত" রেখাকে এমন আচরণ করে যেন মূল লাইনটি মুছে ফেলা হয় এবং একটি নতুন লাইন যুক্ত করা হয়েছিল ... সুতরাং প্রযুক্তিগতভাবে এটি আপনাকে কেবল যুক্ত এবং মুছে ফেলা লাইনগুলি দেখায়।
কেএফরো

2

না, diffআসলে দুটি ফাইলের মধ্যে পার্থক্যটি যেভাবে ভাবতে পারে সেভাবে প্রদর্শন করে না। এটি একটি সরঞ্জামের patchজন্য অন্য একটি ফাইলকে পরিবর্তন করতে ব্যবহার করতে চাইলে এমন সরঞ্জামের জন্য সম্পাদনা কমান্ডগুলির ক্রম তৈরি করে।

আপনি যা খুঁজছেন তা করার কোনও অসুবিধা হ'ল এটি কীভাবে এটি সংজ্ঞায়িত করতে হবে যে একটি লাইন কী পরিবর্তন করে যা মুছে ফেলা বনাম একটি যুক্ত হওয়া অনুসরণ করে changed পাশাপাশি লাইনগুলি যুক্ত, মুছে ফেলা এবং একে অপরের সংলগ্ন পরিবর্তিত অবস্থায় কী করবেন।


আমার চিন্তা ঠিক. মূলটির পরিবর্তনের পরিবর্তে একটি নতুন লাইনের বিবেচনার জন্য একটি লাইনের কত শতাংশ অক্ষরের পরিবর্তন করতে হবে? প্রযুক্তিগতভাবে এমনকি যদি আপনার একটি চরিত্র সাধারণ থাকে তবে আপনি এটিকে মুছে ফেলা এবং সন্নিবেশের পরিবর্তে "পরিবর্তন" হিসাবে বিবেচনা করতে পারেন।
কামিল কিসিয়েল

1
আমি diffসূত্রগুলির দিকে নজর রাখার পরে অনেক দিন হয়ে গেছে , তবে দুটি ফাইল সিঙ্কে থাকার জন্য কোথায় মিলছে তা ট্র্যাক রাখতে আমি সমস্ত ধরণের জিরিশন মনে রাখি এবং আমার মনে হয় যে কতটা দূরে থাকা তার ভিত্তিতে ছেড়ে দেওয়ার জন্য একটি চৌম্বক রয়েছে লাইন হয়। তবে (allyচ্ছিকভাবে) ধসে পড়া সাদা জায়গা বা উপেক্ষা করা কেস বাদে কোনও ইন্টার-লাইন মিলের কথা আমার মনে নেই। বা (সম্ভবত) শব্দগুলি এতে প্রভাব ফেলে। যাই হোক না কেন, এটি সব কিছু patchএবং "vgrep" সওয়ারের জন্য কেবল আসে। হতে পারে. মঙ্গলবারে.
ডেনিস উইলিয়ামসন

2

ভিজ্যুয়াল তুলনা সরঞ্জাম দুটি ফাইল একসাথে ফিট করে যাতে একই সংখ্যার লাইনের সাথে পৃথক সামগ্রী সহ একটি বিভাগকে পরিবর্তিত বিভাগ হিসাবে বিবেচনা করা হবে। মিলে যাওয়া বিভাগগুলির মধ্যে সম্পূর্ণ নতুন রেখাগুলি যুক্ত বিভাগগুলিকে বিবেচনা করা হয়।

এটি এসডিফ কমান্ড-লাইন সরঞ্জামটি কীভাবে কাজ করে যা টার্মিনালে দুটি ফাইলের পাশাপাশি বাইরের তুলনা দেখায়। পরিবর্তিত লাইনগুলি দ্বারা পৃথক করা হয় | অক্ষর। যদি একটি লাইন কেবল এ ফাইলটিতে বিদ্যমান থাকে তবে <বিভাজক চরিত্র হিসাবে ব্যবহৃত হয়। যদি একটি ফাইল কেবল বি ফাইলটিতে থাকে তবে> বিভাজক হিসাবে ব্যবহৃত হয়। আপনার যদি ফাইলগুলিতে <এবং> অক্ষর না থাকে তবে আপনি কেবল যুক্ত লাইনগুলি দেখানোর জন্য এটি ব্যবহার করতে পারেন:

sdiff A B | grep '[<>]'

2

ধন্যবাদ সানরবী, আপনার সমাধান (ভোট দেওয়া হয়নি) আসলে আমাকে টন পৃষ্ঠাগুলিতে যুগে যুগে দেখার পরে যা চেয়েছিল তা হুবহু দিয়েছিল।

আপনার উত্তরটি ব্যবহার করে, আমি এখানে জিনিসগুলির তালিকা পরিবর্তন / যুক্ত / মুছে ফেলার জন্য নিয়ে এসেছি। উদাহরণটি / etc / passwd ফাইলের 2 সংস্করণ ব্যবহার করে এবং প্রাসঙ্গিক রেকর্ডগুলির জন্য ব্যবহারকারীর নাম মুদ্রণ করে।

#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'

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

0

আমি এই নির্দিষ্ট ফর্মটি প্রায়শই দরকারী বলে মনে করি:

diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g

উদাহরণ:

printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
     --new-line-format=$'+%l\n' \
     --unchanged-line-format='' \
     f g

আউটপুট:

-b
-c
+B
+C
-e
-f
+E
+F

সুতরাং এটি সাথে সাথে -একই নতুন লাইন অনুসরণ করে পুরানো রেখাগুলি দেখায় +

আমাদের যদি একটি মুছে ফেলা থাকে C:

printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
     --new-line-format=$'+%l\n' \
     --unchanged-line-format='' \
     f g

এটি দেখতে এরকম দেখাচ্ছে:

-b
+B
+C
-e
-f
+E
+F

ফর্ম্যাটটি এখানে নথিভুক্ত করা হয় man diff:

       --line-format=LFMT
              format all input lines with LFMT`

এবং:

       LTYPE is 'old', 'new', or 'unchanged'.
              GTYPE is LTYPE or 'changed'.

এবং:

              LFMT (only) may contain:

       %L     contents of line

       %l     contents of line, excluding any trailing newline

       [...]

সম্পর্কিত প্রশ্ন: https://stackoverflow.com

উবুন্টুতে পরীক্ষিত 18.04।


-1

file1:

text670_1
text067_1
text067_2

File2:

text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1

ব্যবহার করুন:

diff -y file1 file2

এটি প্রতিস্থাপনকারী ফাইলগুলির জন্য দুটি কলাম দেখায়।

আউটপুট:

text670_1                           
                                  > text04_1
                                  > text04_2
                                  > text05_1
                                  > text05_2
text067_1                           text67_1
text067_2                           text67_2
                                  > text1000_1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.