প্রথম কলামের উপর ভিত্তি করে সদৃশ লাইনগুলি ছাড়াই 2 টি ফাইল বাছাই করুন এবং মার্জ করুন


12

সমস্ত পরীক্ষার নাম সহ আমার কাছে একটি ফাইল রয়েছে:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

এবং পরীক্ষার নাম এবং সম্পর্কিত ফলাফল যুক্ত আরও একটি ফাইল:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

সদৃশ ছাড়াই সম্পর্কিত ফলাফলের সাথে সমস্ত পরীক্ষার নাম যুক্ত একটি নতুন ফাইল কীভাবে তৈরি করবেন?

যদি আমি কার্যকর করি:

sort all_tests.txt completed_tests.txt

আউটপুটটিতে নকল রয়েছে:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

পছন্দসই আউটপুট:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

উত্তর:


17

মনে হয় আপনি joinখুব সহজেই এটি অর্জন করতে পারবেন যদি ফাইলগুলি উভয়ই সাজানো হয়।

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1 এর অর্থ ফাইল 1 এর মুদ্রণ লাইন যা তাদের সাথে কিছুই যোগ করেনি।

যদি আপনার ফাইলগুলি ইতিমধ্যে বাছাই না করা হয় তবে আপনি এটি ব্যবহার করতে পারেন (ধন্যবাদ টেরডন!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

7

এখানে টুল joinযেমন প্রস্তাব @Zanna দ্বারা, কিন্তু এখানে একটি ব্যাপার awkদৃষ্টীকোণ:

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,a[$1]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

2

পার্ল

কার্যকরভাবে, এটি টেরডনের উত্তরের একটি বন্দর:

$ perl -lane '$t+=1; $h{$F[0]}=$F[1] if $.==$t; print $F[0]," ",$h{$F[0]} if $t!=$.;$.=0 if eof' completed_tests.txt all_tests.txt          
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

এটি পরীক্ষার-স্থিতির জোড়াগুলির হ্যাশ তৈরি করে completed_test.txtএবং তারপরে all_tests.txtসেই হ্যাশটিতে লাইনগুলি অনুসন্ধান করে কাজ করে। $tমোট লাইন প্রতিটি ফাইল থেকে প্রক্রিয়াজাত পরিবর্তনশীল এবং $.ফাইলের শেষে পৌঁছনো উপর যে রিসেট করা হয়, আমাদের যা ফাইল বর্তমানে পড়া হয় ট্র্যাক রাখতে অনুমতি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.