আমি ফাইল 2 এর সাথে ফাইল 2 এর সাথে তুলনা করতে এবং এমন ফাইল 3 উত্পন্ন করতে চাই যাতে ফাইল 1-এ লাইন রয়েছে যা ফাইল 2 তে উপস্থিত নেই।
আমি ফাইল 2 এর সাথে ফাইল 2 এর সাথে তুলনা করতে এবং এমন ফাইল 3 উত্পন্ন করতে চাই যাতে ফাইল 1-এ লাইন রয়েছে যা ফাইল 2 তে উপস্থিত নেই।
উত্তর:
ডিফ (1) উত্তরটি নয়, তবে কম (1)।
NAME
comm - compare two sorted files line by line
SYNOPSIS
comm [OPTION]... FILE1 FILE2
...
-1 suppress lines unique to FILE1
-2 suppress lines unique to FILE2
-3 suppress lines that appear in both files
সুতরাং
comm -2 -3 file1 file2 > file3
ইনপুট ফাইলগুলি বাছাই করতে হবে। যদি তা না হয় তবে প্রথমে তাদের বাছাই করুন। এটি একটি অস্থায়ী ফাইল, বা ...
comm -2 -3 <(sort file1) <(sort file2) > file3
আপনার শেল প্রক্রিয়া প্রতিস্থাপন সমর্থন করে (প্রদত্ত)
comm -23
ইউনিক্স ইউটিলিটি diff
হ'ল এই উদ্দেশ্যে।
$ diff -u file1 file2 > file3
বিকল্পগুলি, বিভিন্ন আউটপুট ফর্ম্যাট ইত্যাদির জন্য ম্যানুয়াল এবং ইন্টারনেট দেখুন etc.
এটি বিবেচনা করুন:
ফাইল a.txt:
abcd
efgh
ফাইল b.txt:
abcd
আপনি এর সাথে পার্থক্যটি খুঁজে পেতে পারেন:
diff -a --suppress-common-lines -y a.txt b.txt
আউটপুটটি হবে:
efgh
আপনি আউটপুট ফাইলে (c.txt) ব্যবহার করে আউটপুটটিকে পুনঃনির্দেশ করতে পারেন:
diff -a --suppress-common-lines -y a.txt b.txt > c.txt
এটি আপনার প্রশ্নের উত্তর দেবে:
"... এতে ফাইল 1 এ রেখা রয়েছে যা ফাইল 2 তে উপস্থিত নেই"
-d
, যা diff
সবচেয়ে ছোট সম্ভাব্যতম পার্থক্যটি সন্ধানের জন্য যথাসাধ্য চেষ্টা করবে । -i
, -E
, -w
, -B
এবং --suppress-blank-empty
এছাড়াও দরকারী মাঝেমধ্যে হতে পারে, যদিও সব সময় নয়। আপনার ব্যবহারের ক্ষেত্রে কী মানায় তা যদি আপনি না জানেন তবে diff --help
প্রথমে চেষ্টা করুন (যখন আপনি কোনও কমান্ড কী করতে পারেন তা জানেন না তবে এটি সাধারণত একটি ভাল ধারণা)।
কখনও কখনও diff
আপনার প্রয়োজনীয় ইউটিলিটিটি হয় তবে কখনও কখনও join
এটি আরও উপযুক্ত। ফাইলগুলি প্রাক-বাছাই করা দরকার বা আপনি যদি এমন শেল ব্যবহার করছেন যা প্রক্রিয়া প্রতিস্থাপন যেমন বাশ, কেএসএস বা জেডএস সমর্থন করে তবে আপনি ফ্লাইতে বাছাই করতে পারেন।
join -v 1 <(sort file1) <(sort file2)
চেষ্টা
sdiff file1 file2
এটি আমার জন্য বেশিরভাগ ক্ষেত্রে ব্যবহারযোগ্যভাবে আরও ভাল কাজ করে। লাইনের ক্রমটি গুরুত্বপূর্ণ না হলে আপনি আগে ফাইলগুলি বাছাই করতে চাইতে পারেন (উদাহরণস্বরূপ কিছু পাঠ্য কনফিগারেশন ফাইল)।
উদাহরণ স্বরূপ,
sdiff -w 185 file1.cfg file2.cfg
sdiff <(sort file1) <(sort file2)
)
আপনার যদি কোরিউটিলেস দিয়ে এটি সমাধান করার দরকার হয় তবে গ্রহণযোগ্য উত্তরটি ভাল:
comm -23 <(sort file1) <(sort file2) > file3
আপনি এসডি (স্ট্রিম ডিফ) ব্যবহার করতে পারেন , যার জন্য বাছাই বা বিকল্প প্রয়োগ প্রক্রিয়া প্রয়োজন হয় না এবং অসীম স্ট্রিমগুলি সমর্থন করে যেমন:
cat file1 | sd 'cat file2' > file3
সম্ভবত এই উদাহরণে এতটা উপকারের পরিমাণ না, তবে এখনও এটি বিবেচনা করুন; কিছু কিছু ক্ষেত্রে আপনি ব্যবহার করতে সক্ষম হবেন না comm
কিংবা grep -F
কিংবা diff
।
এখানে একটি ব্লগপোস্ট আমি টার্মিনালে বিভিন্ন স্ট্রিমগুলি সম্পর্কে লিখেছিলাম, যা এসডি প্রবর্তন করে।
ইতিমধ্যে অনেক উত্তর, কিন্তু তাদের কোনওই IMHO নিখুঁত নয়। থানাটোসের জবাব প্রতি লাইনে কিছু অতিরিক্ত অক্ষর রেখে দেয় এবং সর্পিগালের উত্তরের জন্য ফাইলগুলি বাছাই বা প্রাক-বাছাই করা দরকার, যা সমস্ত পরিস্থিতিতে পর্যাপ্ত নাও হতে পারে।
আমি মনে করি লাইন ভিন্ন ভিন্ন অন্য কিছুই হয় পাবার সবচেয়ে ভালো উপায় (কোন অতিরিক্ত অক্ষর, কোন পুনরায় ক্রম) তার সংমিশ্রণ diff
, grep
এবংawk
(বা অনুরূপ)।
যদি লাইনগুলিতে কোনও "<" না থাকে, একটি সংক্ষিপ্ত ওয়ান-লাইনার হতে পারে:
diff urls.txt* | grep "<" | sed 's/< //g'
তবে এটি লাইনগুলি থেকে "<" (স্থানের চেয়ে কম) এর প্রতিটি উদাহরণ সরিয়ে ফেলবে, যা সর্বদা ঠিক থাকে না (যেমন উত্স কোড)। সবচেয়ে নিরাপদ বিকল্পটি হ'ল অ্যাডক ব্যবহার করা:
diff urls.txt* | grep "<" | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}'
এই ওয়ান-লাইনার উভয় ফাইলকে পৃথক করে, তারপরে ভিন্নতার এড-স্টাইল আউটপুট ফিল্টার করে, তারপরে পার্থক্য যুক্ত করা << "অপসারণ করে। লাইনগুলিতে কিছু "<" থাকলেও এটি কাজ করে।
diff a1.txt a2.txt | grep '> ' | sed 's/> //' > a3.txt
আমি এই থ্রেডে প্রায় সমস্ত উত্তর চেষ্টা করেছিলাম, কিন্তু কোনওটিই সম্পূর্ণ হয়নি। উপরের কয়েকটি ট্রেলার পরে আমার পক্ষে কাজ করেছিল। ডিফ আপনাকে পার্থক্য দেবে তবে কিছু অযাচিত বিশেষ চরগুলি দিয়ে। যেখানে আপনি প্রকৃত পার্থক্য লাইনগুলি '>' দিয়ে শুরু হয়। সুতরাং পরবর্তী পদক্ষেপটি গ্রেপ করা লাইনগুলি '>' দিয়ে শুরু হয় এবং এর পরে সেড দিয়ে মুছে ফেলা হয় ।
<
। আপনি যদি ইনপুট ফাইলগুলির ক্রমটি অদলবদল করেন তবে এটি দেখতে পাবেন। এমনকি যদি আপনি এটি করেন তবে আপনি grep
আরও সেড ব্যবহার করে বাদ দিতে চাইবেন : `ডিফ একটি এ 1 এ 2 | কিন্তু '/> / গুলি ///' `এখনও ধারণকারী লাইন ভাঙ্গতে পারে >
বা <
অধিকার পরিস্থিতি এবং এখনও লাইন সংখ্যা বর্ণনা অতিরিক্ত লাইন ছেড়ে। আপনি এই পদ্ধতির চেষ্টা চেয়েছিলেন একটি ভাল উপায় হতে পারে: diff -C0 a1 a2 | sed -ne '/^[+-] /s/^..//p'
।