এই কিসের জন্য প্রস্তুত করা হয়েছিল:
$ awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file2 file1
abc|123|BNY|apple|
cab|234|cyx|orange|
ব্যাখ্যা
-F'|'
: ক্ষেত্র বিভাজককে সেট করে |
।
NR==FNR
: এনআর হ'ল বর্তমান ইনপুট লাইন নম্বর এবং এফএনআর বর্তমান ফাইলের লাইন নম্বর। দু'টি তখনই সমান হবে যখন ১ ম ফাইলটি পড়া হচ্ছে।
c[$1$2]++; next
: এটি যদি ১ ম ফাইল হয় তবে c
অ্যারেতে প্রথম দুটি ক্ষেত্র সংরক্ষণ করুন । তারপরে, পরবর্তী লাইনে এড়িয়ে যান যাতে এটি কেবলমাত্র 1 ম ফাইলে প্রয়োগ করা হয়।
c[$1$2]>0
: অন্য ব্লকটি কেবল তখনই চালিত হবে যদি এটি দ্বিতীয় ফাইল হয় তাই আমরা এই ফাইলটির 1 এবং 2 ক্ষেত্রটি ইতিমধ্যে দেখা গেছে কিনা তা পরীক্ষা করে দেখি ( c[$1$2]>0
) এবং সেগুলি থাকলে, আমরা লাইনটি মুদ্রণ করি। ইন awk
, ডিফল্ট ক্রিয়াটি লাইনটি প্রিন্ট করা হয় যদি c[$1$2]>0
সত্য হয় তবে লাইনটি মুদ্রণ করা হবে।
বিকল্প হিসাবে, যেহেতু আপনি পার্লের সাথে ট্যাগ করেছেন:
perl -e 'open(A, "file2"); while(<A>){/.+?\|[^|]+/ && $k{$&}++};
while(<>){/.+?\|[^|]+/ && do{print if defined($k{$&})}}' file1
ব্যাখ্যা
প্রথম লাইনটি খুলবে file2
, ২ য় |
( .+?\|[^|]+
) অবধি সমস্ত কিছু পড়বে এবং হ্যাশটিতে এটি ( $&
শেষ ম্যাচের অপারেটরের ফলাফল ) সংরক্ষণ করবে %k
।
দ্বিতীয় লাইনটি ফাইল 1 প্রক্রিয়া করে, 1 ম দুটি কলাম আহরণ করতে একই রেজেক্স ব্যবহার করে এবং যদি এই কলামগুলি হ্যাশে সংজ্ঞায়িত করা হয় তবে লাইনটি মুদ্রণ করুন %k
।
উপরোক্ত দুটি পদ্ধতিরই মেমরির মধ্যে ফাইল 2 এর 2 টি প্রথম কলাম ধারণ করতে হবে। আপনার যদি কয়েকটি কয়েক লক্ষ লাইন থাকে তবে সমস্যাটি হওয়া উচিত নয় তবে এটি যদি হয় তবে আপনি এর মতো কিছু করতে পারেন
cut -d'|' -f 1,2 file2 | while read pat; do grep "^$pat" file1; done
তবে তা ধীর হবে।