অ্যাজকের সাথে দুটি ফাইল একত্রিত করুন


9

File1.txt

item1   carA
item2   carB
item3   carC
item4   platD
item5   carE

File2.txt

carA  platA
carB  platB
carC  platC
carE  platE

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

item1   platA
item2   platB
item3   platC
item4   platD
item5   platE

আমি এটা কিভাবে করবো?

উত্তর:


11

নীচের উত্তরটি কিছু প্রাসঙ্গিক পরিবর্তন সহ এসও তে অনুরূপ প্রশ্নোত্তরের ভিত্তিতে :

$ 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    

1
@ পাওয়ানা - মন্তব্যে আপনার দ্বিতীয় প্রশ্নটি সমাধান করার জন্য আমি আমার উত্তর আপডেট করেছি। আমি যদি আপনার প্রশ্নের উত্তর দিয়ে থাকে তবে তা গ্রহণ করুন।
ইয়ারন

6

আমি জানি আপনি বলেছেন 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 সেকেন্ড।


সেক্ষেত্রে সাজানো ইনপুট ডেটা (অস্থায়ী) মধ্যবর্তী ফাইলগুলিতে সঞ্চয় করা ভাল হবে কারণ তুচ্ছ-আকারের ডেটা সেটগুলির জন্য বাছাই করা বেশ দীর্ঘ সময় নেয়। অন্যথায় +1।
ডেভিড ফোস্টার

@ ডেভিড এটি একটি ভাল পয়েন্ট। ব্যক্তিগতভাবে, আমি অন্তর্বর্তী ফাইলগুলি তৈরি করা সত্যই পছন্দ করি না তবে দীর্ঘ সময় চলমান প্রক্রিয়াগুলির সাথে আমি অধৈর্যও বটে। আমি "তুচ্ছ আকারের" কী হবে তা অবাক করেছিলাম এবং তাই আমি একটি ছোট বেঞ্চমার্ক তৈরি করেছিলাম এবং এটি আপনার পরামর্শের সাথে উত্তরে যুক্ত করেছি।
জোল

1 মিও রেকর্ডগুলি সাজানোর পক্ষে যুক্তিযুক্ত আধুনিক ডেস্কটপ কম্পিউটারগুলিতে যথেষ্ট দ্রুত। আরও 2 আরও 3 ক্রমতার অর্ডার দিয়ে আরও জিনিস আকর্ষণীয় হয়ে উঠতে শুরু করে। যে কোনও ক্ষেত্রে বিচ্ছিন্ন (বাস্তব) সময় ( %Eসময় বিন্যাসে) গণনাগত পারফরম্যান্স পরিমাপ করতে কম আকর্ষণীয়। ব্যবহারকারী মোড সিপিইউ সময় ( %Uবা কেবল একটি আনসেট TIMEFORMATভেরিয়েবল) অনেক বেশি অর্থবহ হবে।
ডেভিড ফস্টারস্টার

@ ডেভিড আমি বিভিন্ন সময়ের জন্য ব্যবহারের ক্ষেত্রে সত্যই পরিচিত নই। কেন এটি আরও আকর্ষণীয়? অতিবাহিত সময়টিই সেই সময়ের সাথে মিলে যায় যা আমি আসলে অপেক্ষা করি। 1.5 সেকেন্ড কমান্ডের জন্য, আমি 4.5 সেকেন্ডের সাথে পাচ্ছি %U
জোল

1
একই সিস্টেমে চলমান অন্যান্য কাজগুলির জন্য অপেক্ষা করা এবং I / O অনুরোধগুলি অবরুদ্ধ করার ফলে সময় অতিবাহিত হয়। (ব্যবহারকারী) সিপিইউ সময় হয় না। সাধারণত গণনামূলকভাবে আবদ্ধ অ্যালগরিদমের গতির তুলনা করার সময় কেউ I / O উপেক্ষা করতে এবং অন্যান্য পটভূমির কার্যগুলির কারণে পরিমাপের ত্রুটিগুলি এড়াতে চায়। গুরুত্বপূর্ণ প্রশ্নটি হল "এই অ্যালগরিদমটি সেই ডেটা সেটটিতে কত গণনা প্রয়োজন?" পরিবর্তে "কম্পিউটারটি এই গণনাটি শেষ হওয়ার অপেক্ষায় থাকা অবস্থায় আমার কম্পিউটার তার সমস্ত কাজগুলিতে কত সময় ব্যয় করেছিল?"
ডেভিড ফোস্টার 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.