শর্তসাপেক্ষে বনাম শর্তাধীন বিবৃতি (যদি)


18

বলুন আমার কাছে একটি ফাইল রয়েছে:

PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17

আমি দ্বিতীয় কলামের 1 টির সাথে অসম সমেত প্রতিটি লাইন এটিকে 0 এ পরিবর্তন করতে এবং বাকীটি রাখতে চাই।

আমি যদি if(যেমন শর্তসাপেক্ষ বিবৃতি) ব্যবহার করি তবে সবকিছু ঠিক আছে:

awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0

তবে আমি যখন শর্তযুক্ত ব্লক ব্যবহার করি তখন অনাকাঙ্ক্ষিত কিছু ঘটে:

awk '$2!=1 {print $1,"0"} {print $0}' file
PRO 1
GLN 0
GLN 5.55112e-17
ILE 0
ILE -6.245e-17
THR 0
THR 5.55112e-17

আপনি কী দেখতে পাচ্ছেন তা দেখতে পারেন।

  • আমি কীভাবে এই ত্রুটিটি ঠিক করব?
  • কেন এই ত্রুটি ঘটে?
  • শর্তাধীন বিবৃতি এবং শর্তসাপেক্ষ ব্লকের মধ্যে কী আলাদা?

উত্তর:


26

একটি ifবিবৃতিতে, আপনি একটি আছে else। যদি ifমেলে না, elseশাখাটি কার্যকর করা হবে।

শর্তাধীন বিবৃতিতে, উভয় ক্রিয়াকলাপ কার্যকর করা হয়, শর্তটি নির্বিশেষে সত্য বা মিথ্যা।

একটি সহজ ফিক্স:

$ awk '$2!=1 {print $1,"0";next};{print $0}' file
PRO 1
GLN 0
ILE 0
THR 0

এবং আপনি এটিকে আরও সংক্ষিপ্ত করে তুলতে পারেন:

$ awk '$2 != 1 {print $1,"0";next};1' file
PRO 1
GLN 0
ILE 0
THR 0

যখন শর্তটি সত্য হয় 1এবং কোনও পদক্ষেপ নেই, তখন awkডিফল্ট আচরণ হয় printprintকোন যুক্তি ছাড়াই $0ডিফল্ট মুদ্রণ করা হবে ।


4
আপনি এটি গল্ফ পারে awk '$2!=1?$2=0:"";1' file
টেরডন

@ এটারডন: ভাল গল্ফিং আমি মনে করি এটি বুঝতে অসুবিধে হওয়া ওপি করা কঠিন হতে পারে।
cuonglm

1
@ কুওগলম আপনি দয়া করে এর ভূমিকাটি ব্যাখ্যা করতে পারেন next। আমার ধারণা প্রথমটি সত্য হলে এটি দ্বিতীয় মুদ্রণটিকে দমন করে। ভালো কিছু continueমধ্যে C
আলেকজান্ডার সিস্কা

@ আলেকজান্ডার সিএসকা: nextবর্তমান ইনপুট লাইন প্রসেসিং দমন করে, পরবর্তীটিতে যান। হিসাবে একই ভূমিকা while, কিন্তু পুরো awkপ্রোগ্রামের জন্য। এছাড়াও, awkএর নিজস্ব আছেwhile
কিউংলম

10

দ্বিতীয় ব্লক ইন

awk '$2!=1 {print $1,"0"} {print $0}' file

শর্তসাপেক্ষ নয়। এটি প্রতিটি লাইনের জন্য কাজ করা হয় এবং এইভাবে প্রতিটি লাইন মুদ্রণ করে।

পরিবর্তে, লিখুন:

awk '$2!=1 {print $1,"0"} $2==1 {print $0}' file

বা লিখুন:

awk '$2!=1 {print $1,"0"; next} {print $0}' file

শর্তসাপেক্ষ ব্লকটি যদি মিলে যায় তবে এটি শর্তহীন ব্লকটি এড়ানো যাবে।

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