প্রথমে দ্বিতীয়টি দুটি ক্ষেত্র বাছাই করার চেষ্টা করছি


106

আমি একাধিক কলাম সাজানোর চেষ্টা করছি। ফলাফল প্রত্যাশিত হিসাবে হয় না।

এখানে আমার ডেটা (people.txt):

Simon Strange 62
Pete Brown 37
Mark Brown 46
Stefan Heinz 52
Tony Bedford 50
John Strange 51
Fred Bloggs 22
James Bedford 21
Emily Bedford 18
Ana Villamor 44
Alice Villamor 50
Francis Chepstow 56

নিম্নলিখিতটি সঠিকভাবে কাজ করে:

bash-3.2$ sort -k2 -k3 <people.txt                                                                                                                    
Emily Bedford 18                                                                                                                                      
James Bedford 21                                                                                                                                      
Tony Bedford 50                                                                                                                                       
Fred Bloggs 22                                                                                                                                        
Pete Brown 37                                                                                                                                         
Mark Brown 46                                                                                                                                         
Francis Chepstow 56                                                                                                                                   
Stefan Heinz 52                                                                                                                                       
John Strange 51                                                                                                                                       
Simon Strange 62                                                                                                                                      
Ana Villamor 44                                                                                                                                       
Alice Villamor 50

তবে, নিম্নলিখিতটি প্রত্যাশার মতো কাজ করে না:

bash-3.2$ sort -k2 -k1 <people.txt                                        
Emily Bedford 18                                                                                                                                      
James Bedford 21                                                                                                                                      
Tony Bedford 50                                                                                                                                       
Fred Bloggs 22                                                                                                                                        
Pete Brown 37                                                                                                                                         
Mark Brown 46                                                                                                                                         
Francis Chepstow 56                                                                                                                                   
Stefan Heinz 52                                                                                                                                       
John Strange 51                                                                                                                                       
Simon Strange 62                                                                                                                                      
Ana Villamor 44                                                                                                                                       
Alice Villamor 50

আমি নাম এবং তারপরে প্রথম নাম অনুসারে বাছাই করার চেষ্টা করছিলাম তবে আপনি দেখতে পাবেন যে ভিলেমর্স সঠিক ক্রমে নেই। আমি আখের নাম অনুসারে বাছাই করার আশা করছিলাম, এবং তারপরে যখন প্রথম নামটি মিলিয়ে রাখলাম, তখন প্রথম নাম অনুসারে বাছাই করব।

দেখে মনে হচ্ছে এটির কীভাবে কাজ করা উচিত তা আমি বুঝতে পারি না। আমি এটি অবশ্যই অন্য কোনও উপায়ে করতে পারি (অ্যাজক ব্যবহার করে), তবে আমি বাছাই করতে চাই।

আমি ম্যাক ওএস এক্সে স্ট্যান্ডার্ড বাশ শেল ব্যবহার করছি।

উত্তর:


159

একটি মূল স্পেসিফিকেশন -k2মানে ক্ষেত্রটি 2 থেকে শুরু করে শেষের দিকে সমস্ত ক্ষেত্রকে অ্যাকাউন্টে নেওয়া। সুতরাং Villamor 44আগে শেষ Villamor 50। যেহেতু এই দুটি সমান নয়, তাই প্রথম তুলনা sort -k2 -k1এই দুটি লাইনের বৈষম্যের জন্য যথেষ্ট, এবং দ্বিতীয় সাজানোর কীটি -k1চাওয়া হয় না। যদি দু'জন ভিলেমারের বয়স একই হয় -k1তবে তাদের প্রথম নাম অনুসারে বাছাই করা হত।

একটি একক কলাম অনুসারে বাছাই করতে, -k2,2কী স্পেসিফিকেশন হিসাবে ব্যবহার করুন । এর অর্থ হল # 2 থেকে # 2 পর্যন্ত ক্ষেত্রগুলি ব্যবহার করা, অর্থাৎ শুধুমাত্র দ্বিতীয় ক্ষেত্র।

sort -k2 -k3 <people.txtঅপ্রয়োজনীয়: এটি সমান sort -k2 <people.txt। শেষ নাম অনুসারে বাছাই করতে, তারপরে প্রথম নামগুলি, তারপরে বয়স, নিম্নলিখিত কমান্ডটি চালান:

sort -k2,2 -k1,1 <people.txt

বা সমতুল্য sort -k2,2 -k1 <people.txtযেহেতু কেবলমাত্র এই তিনটি ক্ষেত্র এবং বিভাজকগুলি একই। প্রকৃতপক্ষে, আপনি একই প্রভাবটি পাবেন sort -k2,2 <people.txt, কারণ sortলাইনগুলির একটি উপসেটে থাকা সমস্ত কীগুলি অভিন্ন হলে পুরো রেখাকে শেষ অবলম্বন হিসাবে ব্যবহার করে।

এছাড়াও খেয়াল করুন যে ডিফল্ট ক্ষেত্র বিভাজকটি একটি নন-ফাঁকা এবং ফাঁকা মধ্যে স্থানান্তর, সুতরাং কীগুলি নেতৃস্থানীয় ফাঁকা স্থানগুলি অন্তর্ভুক্ত করবে (আপনার উদাহরণস্বরূপ, প্রথম লাইনের জন্য, প্রথম কীটি হবে "Emily"তবে দ্বিতীয় কীটি যুক্ত " Bedford"করুন the -bএই ফাঁকা ফেলা বিকল্প:

sort -b -k2,2 -k1,1

bমূল প্রারম্ভিক বিবরণটির শেষে পতাকা যুক্ত করে এটি প্রতি-কী ভিত্তিতেও করা যেতে পারে :

sort -k2b,2 -k1,1 <people.txt

তবে মনে রাখার মতো কিছু: আপনি মূল স্পেসিফিকেশনে এই জাতীয় পতাকা যুক্ত করার সাথে সাথে বৈশ্বিক পতাকাগুলি (যেমন -n, -r...) আর সেগুলিতে প্রযোজ্য নয় তাই প্রতি-কী পতাকা এবং বিশ্ব পতাকাগুলি মিশ্রণ এড়ানো ভাল to


6
আপনি এটি পেরেক দিয়েছিলেন। আমি ধরে নিয়েছি (করণে একটি বিপজ্জনক কাজ) যে -k1 উল্লেখ করা মানে ব্যবহার ক্ষেত্র 1, যেখানে ক্ষেত্রটি ডিফল্ট ফিল্ড বিভাজক (স্পেস) এ শেষ হয়। তবে আপনি যেমনটি পরিষ্কারভাবে উল্লেখ করেছেন, k বিকল্পটি আপনাকে কীটির শুরু এবং স্টপ পয়েন্ট নির্দিষ্ট করার প্রত্যাশা করে, যা একক ক্ষেত্র হতে পারে বা নাও হতে পারে। আপনার সমাধানটি নিখুঁতভাবে কাজ করে এবং আরও গুরুত্বপূর্ণ এটি কেন এটি করে তা সম্পর্কে আমি স্পষ্ট। অনেক ধন্যবাদ.
হ্যারি

এটি বিশাল। কেইইডিইডিএফ সম্পর্কে আরও অনেক উত্স-প্রতিটি কোডের প্রতিটি ধাপে কলামগুলি বিবেচনা করা হচ্ছে তা সীমাবদ্ধ করার জন্য ফর্ম্যাটে COMMA এর গুরুত্বকে গুরুত্ব না দিয়েই -k1 -k2 সম্পর্কে কথা বলে talk আমি এই উত্তরটি না পাওয়া পর্যন্ত আমি কয়েক ঘন্টা ধরে আটকে ছিলাম। এবং ম্যান পেজটি এখানে বিভ্রান্ত করছে। এটি ব্যাখ্যা করে না যে "শুরু এবং থামান" অবস্থানগুলি কমা স্বরলিপি সহ নির্দিষ্ট করা আছে। ধন্যবাদ!
জেসন রোহার

16

জিএনইউ দিয়ে sortআপনি এটি এমনটি করেন, ম্যাকওএস সম্পর্কে নিশ্চিত নন:

sort -k2,2 -k1 <people.txt

মন্তব্য অনুযায়ী আপডেট করুন। থেকে উদ্ধৃত man sort:

   -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type

   KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where
   F is a field number and C a character position in the field; both are
   origin 1, and the stop position defaults to the line's end.

4
আপনি কি এই অদ্ভুত স্বরলিপি ব্যাখ্যা করতে পারেন?
স্কাই

1
এটি আমাকে সঠিক লাইন বরাবর ভাবতে বাধ্য করেছে - এর জন্য ধন্যবাদ। তবে দ্বিতীয়-কে-র জন্য আপনার স্টপ পয়েন্ট নির্দিষ্ট করার দরকার নেই। এটি -k2,2 -k1,1 অন্যথায় স্টপ পয়েন্টটি লাইনের শেষ হিসাবে নেওয়া হয়?
হ্যারি

@ টনিবেডফোর্ড, সঠিক কিন্তু নির্দিষ্ট না স্টপ অবস্থান আপনার বর্তমান ইনপুট জন্য ফলাফলের পরিবর্তন করবে না, কিন্তু যদি দৃঢ়তা বাধ্য করা হবে আপনি কি কখনো অভিন্ন ক্ষেত্র 2 এবং 1. সঙ্গে একাধিক লাইন তাই আমি গত অনুমতি পছন্দ করা থাকবে -kযতটা এটা করতে পারেন অন্তর্ভুক্ত করা।
manatwork

1
@ মান্যাটওয়ার্ক যা প্রয়োজন হবে না; যদি সমস্ত নির্দিষ্ট ক্ষেত্র সমান sortতুলনা করে তবে সম্পূর্ণ লাইনটি তুলনা করবে। অথবা জিএনইউ দিয়ে sortআপনি -sস্থিতিশীল সাজানোর জন্য ব্যবহার করতে পারেন ।
আগস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.