উত্তর:
নীচের উত্তরটি কিছু প্রাসঙ্গিক পরিবর্তন সহ এসও তে অনুরূপ প্রশ্নোত্তরের ভিত্তিতে :
$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($2 in dict) ? dict[$2] : $2}1' file2.txt file1.txt
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
ধারণাটি হ'ল সূচক সহ একটি হ্যাশ-মানচিত্র তৈরি করা এবং অভিধান হিসাবে এটি ব্যবহার করা।
আপনি আপনার মন্তব্যে জিজ্ঞাসা করা দ্বিতীয় প্রশ্নটির জন্য ( দ্বিতীয় কলামটি file1.txt
ষষ্ঠ কলাম হবে তবে কী পরিবর্তন করা উচিত ):
যদি ইনপুট ফাইলটি এর মতো হবে file1b.txt
:
item1 A5 B C D carA
item2 A4 1 2 3 carB
item3 A3 2 3 4 carC
item4 A2 4 5 6 platD
item5 A1 7 8 9 carE
নিম্নলিখিত আদেশটি এটি করবে:
$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($6 in dict) ? dict[$6] : $6;$3="";$4="";$5="";$6=""}1' file2.txt file1b.txt
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
আমি জানি আপনি বলেছেন awk
, কিন্তু join
এই উদ্দেশ্যে একটি আদেশ আছে ...
{
join -o 1.1,2.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
join -v 1 -o 1.1,1.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
} | sort -k 1
এটি প্রথম join
কমান্ডের সাথে যথেষ্ট হবে যদি এটি এই লাইনের জন্য না হয়:
item4 platD
কমান্ডটি মূলত বলেছে: প্রথম ফাইলের দ্বিতীয় কলাম ( -1 2
) এবং দ্বিতীয় ফাইলের প্রথম কলাম ( ) এর উপর ভিত্তি করে যোগদান করুন এবং প্রথম ফাইলের প্রথম কলাম এবং দ্বিতীয় ফাইলের দ্বিতীয় কলাম ( -2 1
) আউটপুট করুন -o 1.1,2.2
। এটি কেবল জোড় করে রেখাগুলি দেখায়। দ্বিতীয় জোড় কমান্ড প্রায় একই কথা বলে, তবে এটি প্রথম ফাইল থেকে লাইনগুলি প্রদর্শন করতে বলেছে যা যুক্ত করা যায় না ( -v 1
), এবং প্রথম ফাইলের প্রথম কলাম এবং প্রথম ফাইলের দ্বিতীয় কলাম ( ) আউটপুট দেয় -o 1.1,1.2
। তারপরে আমরা উভয় মিলিত আউটপুট সাজান। sort -k 1
মানে প্রথম কলামের sort -k 2
উপর ভিত্তি করে সাজানো এবং দ্বিতীয়টির ভিত্তিতে বাছাই করা। যোগদানের কলামের উপর ভিত্তি করে ফাইলগুলি পাস করার আগে তাদের বাছাই করা গুরুত্বপূর্ণ join
।
এখন, আমি দু'বার বাছাই লিখেছি, কারণ আমি যদি আমার ডিরেক্টরিগুলি ফাইলগুলিতে সাহায্য করতে পারি তবে তা লিখিতভাবে ছড়িয়ে দিতে পছন্দ করি না। তবে, যেমন ডেভিড ফোস্টার বলেছিলেন, ফাইলগুলির আকারের উপর নির্ভর করে আপনি ফাইলগুলি বাছাই করতে এবং প্রথমে সেভ করতে চান যাতে প্রতিবার দু'বার বাছাই করার অপেক্ষা না থাকে। আকারগুলির ধারণা দেওয়ার জন্য, আমার কম্পিউটারে 1 মিলিয়ন এবং 1 মিলিয়ন লাইনগুলি সাজানোর সময় এখানে এসেছে:
$ ruby -e '(1..1000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 1million.txt
$ ruby -e '(1..10000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 10million.txt
$ head 10million.txt
item530284 plat530284
item7946579 plat7946579
item1521735 plat1521735
item9762844 plat9762844
item2289811 plat2289811
item6878181 plat6878181
item7957075 plat7957075
item2527811 plat2527811
item5940907 plat5940907
item3289494 plat3289494
$ TIMEFORMAT=%E
$ time sort 1million.txt >/dev/null
1.547
$ time sort 10million.txt >/dev/null
19.187
এটি 1 মিলিয়ন লাইনের জন্য 1.5 সেকেন্ড এবং 10 মিলিয়ন লাইনের জন্য 19 সেকেন্ড।
%E
সময় বিন্যাসে) গণনাগত পারফরম্যান্স পরিমাপ করতে কম আকর্ষণীয়। ব্যবহারকারী মোড সিপিইউ সময় ( %U
বা কেবল একটি আনসেট TIMEFORMAT
ভেরিয়েবল) অনেক বেশি অর্থবহ হবে।
%U
।