এমন কোনও সরঞ্জাম আছে যা লাইন পেতে পারে যা ফাইল এ থাকে তবে ফাইল বি থাকে না? আমি পার্ল দিয়ে কিছুটা সহজ স্ক্রিপ্ট তৈরি করতে পারতাম, তবে এর আগে যদি ইতিমধ্যে কিছু থাকে তবে আমি এখন থেকে আমার সময় বাঁচাব।
এমন কোনও সরঞ্জাম আছে যা লাইন পেতে পারে যা ফাইল এ থাকে তবে ফাইল বি থাকে না? আমি পার্ল দিয়ে কিছুটা সহজ স্ক্রিপ্ট তৈরি করতে পারতাম, তবে এর আগে যদি ইতিমধ্যে কিছু থাকে তবে আমি এখন থেকে আমার সময় বাঁচাব।
উত্তর:
হ্যাঁ. grep
পাঠ্য স্ট্রিংগুলির জন্য ফাইলগুলি অনুসন্ধানের জন্য আদর্শ সরঞ্জামটি অন্য একটি ফাইলের সমস্ত লাইন বিয়োগ করতে ব্যবহার করা যেতে পারে।
grep -F -x -v -f fileB fileA
এটি ফাইলবির প্রতিটি লাইনকে নিদর্শন ( -f fileB
) হিসাবে ব্যবহার করে এবং এটি ম্যাচ করার জন্য একটি সরল স্ট্রিং হিসাবে বিবেচনা করে কাজ করে (নিয়মিত রেজেক্স নয়) ( -F
)। আপনি ম্যাচটি পুরো লাইনে ( -x
) করতে বাধ্য করে এবং কেবল যে লাইনগুলি মেলে না তা মুদ্রণ করে ( -v
)। অতএব আপনি ফাইলএলাইনগুলিতে লাইনগুলি মুদ্রণ করছেন যা ফাইলবিতে কোনও লাইনের মতো একই ডেটা ধারণ করে না।
এই সমাধানটির ক্ষতিটি হ'ল এটি লাইন ক্রমটিকে বিবেচনায় নেয় না এবং যদি আপনার ইনপুটটিতে বিভিন্ন জায়গায় সদৃশ লাইন থাকে তবে আপনি যা আশা করেন তা পেতে পারেন না। এর সমাধান হ'ল আসল তুলনার সরঞ্জাম যেমন ব্যবহার করা diff
। আপনি ফাইলের 100% রেখার প্রসঙ্গের মান সহ একটি পৃথক ফাইল তৈরি করে এটি করতে পারেন, তবে এটি কেবলমাত্র রেখাগুলির জন্য পার্স করে যা ফাইল এ-তে বি রূপান্তরিত হলে মুছে ফেলা হবে (নোট এই আদেশটি পৃথককেও সরিয়ে দেয় সঠিক লাইনের পরে বিন্যাসকরণ।)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC
-u
আর্গুমেন্ট আসলে কোনও সংখ্যার পরামিতি নেয় যতক্ষণ না এটি স্পেস অনুসরণ না করে। আমার আগে যেভাবে ছিল তা হ'ল সুবিধাটি হ'ল এটি কোনও মান সহ বা ছাড়াই কাজ করবে, সুতরাং আপনি সেই উপ-কমান্ডের রুটিনে এমন কিছু ব্যবহার করতে পারেন যা আউটপুট না হয়ে ফিরে আসে। অন্যদিকে উচ্চতর ক্ষেত্রে '-U' এর জন্য একটি যুক্তি প্রয়োজন।
diff
পাইপলাইন একটি আচরণ ধন্যবাদ কাজ করে।
grep
। উদাহরণ:grep -F -x -v -f <(sort fileB) <(sort fileA)
diff
হ'ল ফাইলের সেই অবস্থানটি অ্যাকাউন্টে নেওয়া হয়।
উত্তর আপনি তুলনা করছেন ফাইলের ধরণ এবং ফর্ম্যাট উপর একটি মহান চুক্তি নির্ভর করে।
আপনি যে ফাইলগুলির সাথে তুলনা করছেন সেগুলি যদি পাঠ্য ফাইলগুলি বাছাই করা হয়, তবে রিচার্ড স্টালম্যান এবং ডেভিড ম্যাকেনজির লিখিত জিএনইউ সরঞ্জামটি comm
আপনার পরে থাকা ফিল্টারিং সম্পাদন করতে পারে। এটি কোর্টিলের অংশ।
বলুন যে আপনার কাছে নিম্নলিখিত 2 টি ফাইল রয়েছে:
$ cat a
1
2
3
4
5
$ cat b
1
2
3
4
5
6
ফাইলের মধ্যে লাইনস b
যে ফাইল নেই a
:
$ comm <(sort a) <(sort b) -3
6
comm
; দুর্ভাগ্যক্রমে, comm
বাছাই করা ফাইলগুলির প্রয়োজন
<()
? এটি কাজ করে এবং আমি এটি পেয়েছি, তবে এই অদ্ভুততার কোনও নাম আছে?
comm
আরএমএস নয়, বেল ল্যাবস-এ কেউ লিখেছেন মূলত ১৯ circ৩ এর সার্কা। আপনি GNU বাস্তবায়নের কথা উল্লেখ করছেন যা অনেক পরে এসেছিল। কয়েক বছর ধরে ইউনিক্স ইউটিলিটিগুলির বিভিন্ন বাস্তবায়ন হয়েছে।
স্ট্যাকওভারফ্লো থেকে ...
কম -23 ফাইল 1 ফাইল 2
-23 উভয় ফাইলে বা কেবল 2 ফাইলের মধ্যে থাকা লাইনগুলি দমন করে The ফাইলগুলি বাছাই করতে হবে (তারা আপনার উদাহরণে রয়েছে) তবে তা না হলে প্রথমে বাছাইয়ের মাধ্যমে পাইপ করুন ...
ম্যান পৃষ্ঠাটি এখানে দেখুন
গ্রেপ এবং কম (ধরণের সহ) পদ্ধতিগুলি বড় ফাইলগুলিতে দীর্ঘ সময় নেয় । সিজিএক্সএক্স এবং ঘোস্টডোগ 74 স্ট্যাক ওভারফ্লোতে দুটি ফাইলের মধ্যে একটির জন্য অনন্য লাইনগুলি আহরণের জন্য দুটি দুর্দান্ত অ্যাডক পদ্ধতি শেয়ার করেছে :
$ awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file1 file2
$ awk 'FNR==NR{a[$0]++;next}(!($0 in a))' file1 file2
যদি ফাইলগুলি বড় হয় এবং আপনার এন্ট্রিগুলিতে আপনার কাস্টম অর্ডার না থাকে তবে গ্রেপটি অনেক বেশি সময় নেয়। একটি দ্রুত বিকল্প হবে
sort file1 > 1
sort file2 > 2
diff 1 2 | grep "\>" | sed -e 's/> //'
[ফাইল 2-ফাইল 1 ফলাফল স্ক্রিনে, পাইপ থেকে ফাইল ইত্যাদি]]
পরিবর্তন >
করা <
বিপরীত বিয়োগফল পাবেন।rm 1 2