একসাথে একাধিক ভেরিয়েবলকে অর্জকে নিয়োগ করুন


9

আমি একটি স্ট্রিং থেকে দুটি সংখ্যাগত মান টানতে চেষ্টা করেছি এবং তাদের ব্যবহার করে ভেরিয়েবলগুলিকে বরাদ্দ করতে চাই awk( gawkযা আমি বিশেষভাবে ব্যবহার করছি)। আমি একটি টিএমউक्स সংস্করণ স্ট্রিংয়ের বাইরে মুখ্য এবং গৌণ সংস্করণ নম্বরগুলি awkভেরিয়েবলগুলিতে টানতে চাই , যেমন:

  • ইনপুট: tmux 2.8; maj == 2এবংmin == 8
  • ইনপুট: tmux 1.9a; maj == 1এবংmin == 9
  • ইনপুট: tmux 2.10; maj == 2এবংmin == 10

আমার ইনপুটটি tmux -Vস্টিডিন থেকে এসেছে বলে ধরে নিচ্ছি , আমার কাছে বর্তমানে নিম্নলিখিতগুলি রয়েছে:

tmux -V | awk '{
                  maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
                  min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
                  # ...do something with maj and min...
               }'

এটি কাজ করে, তবে tmux- র অনেক ব্যবহারকারী জানেন if-shellযে .tmux.confফাইলটিতে (যেখানে আমি এই জিনিসগুলি ব্যবহারের আশা করি) সহজেই কনফিগার ফাইলে সত্যিই দীর্ঘ লাইন নিয়ে যেতে পারে , তাই আমি ভাবছি যে এই দুটি ভেরিয়েবলকে একত্রিত করার কোনও উপায় আছে কিনা? স্থান বাঁচানোর জন্য একটি বিবৃতিতে অ্যাসাইনমেন্ট ... বা অন্য কোনও উপায়ে ইনপুট থেকে এই দুটি ভেরিয়েবল সংগ্রহ করতে এবং স্থান বাঁচাতে।

আমি এরকম কিছু নিয়ে ভাবছি:

awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'

... পাইথনের মতো ধরণের, তবে সেই নির্দিষ্ট বাক্য গঠনটি বিদ্যমান নেই awk। এমন কি আর কিছু আছে যা সম্ভব?

নোট করুন যে পাঠযোগ্যতা সত্যিকারের উদ্বেগ নয়, কেবল দৈর্ঘ্য।

উত্তর:


9

দ্রষ্টব্য যে gensubএটি একটি gawkএক্সটেনশন, এটি অন্য কোনও awkপ্রয়োগের সাথে কাজ করবে না । আরও মনে রাখবেন যে +অ্যানারি অপারেটর সমস্ত awkপ্রয়োগে সংখ্যার রূপান্তরকে জোর করে না , ব্যবহার + 0করা আরও পোর্টেবল।

এখানে আপনি করতে পারেন:

tmux -V | awk -F '[ .]' '{maj = $2+0; min = $3+0; print maj, min}'

আপনি যদি জিএনইউ awkএক্সটেনশনগুলি ব্যবহার করতে আপত্তি না করেন তবে আপনি এটি করতেও পারেন:

tmux -V | awk -v FPAT='[0-9]+' '{maj = $1; min = $2; print maj, min}'

সামঞ্জস্যতা উপর অতিরিক্ত ব্যাখ্যা জন্য ধন্যবাদ!
ভিলাপএক্স

13

আপনি যেহেতু GNU awk ব্যবহার করছেন তাই আপনি match()একাধিক ক্যাপচারিং গ্রুপগুলি সঞ্চয় করতে 3-আরগ ফর্মটি ব্যবহার করতে পারেন :

awk '
    match($0, /([0-9]+)\.([0-9]+)/, m) {maj=m[1]; min=m[2]; print maj, min}
' <<END
tmux 2.8
tmux 1.9a
tmux 2.10
END
2 8
1 9
2 10

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html


5

আপনি সংস্করণটিকে একটি অ্যারেতে বিভক্ত করতে পারেন:

awk '{ split($2, ver, /[.a-z]/) }'

তার ver[1]পরিবর্তে maj, ver[2]পরিবর্তে ব্যবহার করুন min

a-zবিভাজকটিতে যুক্ত করা সংস্করণ নম্বর থেকে কোনও ছোট হাতের অক্ষর সরিয়ে দেয়। (অন্যান্য সমাধানগুলি এখানে আরও ভাল, যেহেতু তারা স্পষ্টভাবে সংখ্যাগুলি বের করে))


3

অন্য একজন ব্যবহারকারী এই উত্তর পোস্ট করেছেন এবং এটি পরে মুছে ফেলা হয়েছে। আমি মনে করি এটি কার্যকর ছিল:

ব্যবহার split()ফাংশন, একটি অ্যারের মধ্যে সংস্করণ চিহ্নকারী পংক্তির বিভক্ত ver, তারপর এক্সেস ver[1]এবং ver[2]বদলে majএবং minযথাক্রমে (বা শুধু ঐ ভেরিয়েবল মান সংরক্ষণ):

tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'

এখানে প্লাসটি হ'ল এটি split()কোনও gawkএক্সটেনশন নয় (যদিও এটির fourthচ্ছিক চতুর্থ যুক্তিটি sepsরয়েছে)।


+1 তবে কেন কেবল স্ট্রিং ফাংশনের /[.a-z]/তৃতীয় (ক্ষেত্র বিভাজন) যুক্তি হিসাবে ব্যবহার করবেন ? split"."
সিবিহে

2
@ চবি আমার উত্তরের ব্যাখ্যাটি দেখুন (যা আমি মুছে ফেলা না যেহেতু ভিলাপেক্স এটি কার্যকর মনে করে, ধন্যবাদ ভিলেপেক্স!)।
স্টিফেন কিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.