কলাম মান শর্তাবলী সঙ্গে awk ব্যবহার


108

আমি অ্যাডাব্লুকে প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে শিখছি এবং উদাহরণগুলির একটিতে আমার সমস্যা আছে।

যদি আমি print 3 মুদ্রণ করতে চাইতাম যদি $ 2 একটি মান (যেমন 1) এর সমান হয় , আমি এই আদেশটি ব্যবহার করছিলাম যা ভাল কাজ করে:

awk '$2==1 {print $3}' <infile> | more

তবে যখন আমি 1টিকে অন্য অনুসন্ধানের মানদণ্ডের দ্বারা প্রতিস্থাপন করি (উদাহরণস্বরূপ findtext), কমান্ডটি কার্যকর করে না:

awk '$1== findtext {print $3}' <infile> | more

এটি কোনও আউটপুট ফেরত না এবং আমি নিশ্চিত যে ইনপুট ফাইলে 'সন্ধানী' উপস্থিত রয়েছে।

আমি এটি চেষ্টাও করেছি, তবে এটি কার্যকর হয় না:

awk '$1== "findtext" {print $3}' <infile> | more

এখানে আমার পরীক্ষার ফাইলটির নাম 'পরীক্ষা' করা হয়েছে এবং এতে 9 টি লাইন এবং 8 টি ক্ষেত্র রয়েছে, যা স্থান দ্বারা পৃথক করা হয়েছে:

1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

এখানে আমি কী করেছি এবং আউটপুট:

$awk '$8 == "ClNonZ" {print $3}' test 

$ grep ClNonZ test 
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

আমি এটি দেখতে পাব যা তাদের $ 8 এর মধ্যে "ClNonZ" রয়েছে এমন 3 ডলার।

0.180467091 
0.010615711 
0.492569002

কেন জানি না কেন অর্ক কমান্ড কিছুই ফিরিয়ে দেয়নি। কোন চিন্তা?


আপনার স্ট্রিং মান "ফাইন্ডেক্সট" উদ্ধৃত করতে হবে, অন্যথায় এটি একটি পরিবর্তনশীল নাম
— অশুভ ot

আমি "সন্ধানের" সাথে ডাবল উদ্ধৃতি চেষ্টা করেছি, তবে এটি কার্যকর হয় না ... এজন্য এটি আমাকে বিরক্ত করে
— ব্যবহারকারীর68683030

1
"কাজ করে না" আমাদের কিছু বলে না। আমাদের সঠিক ইনপুট, সঠিক কোড, প্রত্যাশিত আউটপুট এবং প্রকৃত আউটপুট প্রদর্শন করুন।
— চ্যানার

উত্তর:


128

আপনি যদি কোনও নির্দিষ্ট স্ট্রিং সন্ধান করছেন তবে এর চারপাশে উদ্ধৃতিগুলি রাখুন:

awk '$1 == "findtext" {print $3}'

অন্যথায়, awk এটি একটি পরিবর্তনশীল নাম ধরে নেবে।


আমি এটি চেষ্টা করেছিলাম কিন্তু এটি কাজ করে না কেন আমি জানি না। আমি গ্রিপ দিয়ে ডাবল চেক করেছি এবং পাঠ্যটি সেখানে ছিল। :(
— ব্যবহারকারী1687130

1
@ ব্যবহারকারী1687130, আমি মনে করি আপনাকে আমাদের কিছু উদাহরণ ইনপুট এবং প্রত্যাশিত আউটপুট দেখাতে হবে।
— কার্ল নরুম

1
আপনি কি নিশ্চিত যে আপনার ডেটা স্থান-বিচ্ছিন্ন। এই জায়গাগুলির কিছু ট্যাব হতে পারে? একক ক্ষেত্র প্রতিধ্বনি করতে awk ব্যবহার করে চেষ্টা করুন। awk '{ print $8 }'আপনি কি আশা করবেন কি দেয়?
— রব ডেভিস

1
এটি AWKবাস্তবায়নের কারণে হতে পারে (এটি দিয়ে দেখুন awk --version), আমার উত্তরটি একবার দেখুন, এটি কাজ করে GAWKএবং MAWKখুব কার্যকর।
— আরুতাকু

যখন আমরা awk স্ক্রিপ্টের চারপাশে ডাবল উদ্ধৃতি ব্যবহার করি তখন এটি কাজ করে না। লাইকawk "$1 == \"findtext\" {print $3}"
— থিরুপাঠি থানগাভেল

33

এই পদ্ধতিটি regexp ব্যবহার করে, এটি কাজ করা উচিত:

awk '$2 ~ /findtext/ {print $3}' <infile>

ধন্যবাদ আমি ডায়াবেলিক পদ্ধতি এবং গ্রেপ ব্যবহার না করে $ এনএফ-তে রেজেক্সগুলি সন্ধান করার জন্য অ্যাডক ব্যবহার করার একটি উপায় অনুসন্ধান করছিলাম
— থিবল্ট লইজন

20

AWKবাস্তবায়নের উপর নির্ভর করে আপনি ব্যবহার ==করছেন ঠিক আছে কি না।

আপনি চেষ্টা করেছেন ~? উদাহরণস্বরূপ, আপনি যদি 1 ডলার "হ্যালো" হতে চান:

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^মানে $ 1 শুরু, এবং $এটি $ 1 শেষ।


4
সমস্ত অজানা বাস্তবায়ন "==" এবং "~" উভয়কেই সমর্থন করে।
— এড মর্টন

2
@ এডমার্টন - ওএস এক্স এর সাথে মেলতে awkব্যর্থ হয়েছে ==, তবে সফল হয়েছে ~।
— jww

2
@jww কিসের সাথে মিলতে ব্যর্থ? এগুলি সমতুল্য: $1 == "hello"এবং $1 ~ /^hello$/। আপনি কখনই $1 ~ "^hello$"এই উত্তরে দেখানো হিসাবে কখনই করবেন না কারণ এটি একটি রেজিএক্সপেক্স প্রসঙ্গে স্ট্রিংটি ব্যবহার করে এবং তাই অ্যাজকে স্ট্রিংটি ব্যবহার করার আগে তাকে একটি রেজিপ্সে রূপান্তর করতে হবে এবং এর পার্শ্ব-প্রতিক্রিয়া রয়েছে (ম্যান অ্যাড)।
— এড মর্টন

4

এটি আমার জন্য আরও পাঠযোগ্য

awk '{if ($2 ~ /findtext/) print $3}' <infile>

2

আমার অ্যাজকি সংস্করণটি 3.1.5।

হ্যাঁ, ইনপুট ফাইলটি স্থান পৃথক, কোনও ট্যাব নেই।

আরুতাকুর উত্তর অনুসারে, আমি যা চেষ্টা করেছি তা এখানে:

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002


$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

কী কাজ করে নি (কেন জানি না এবং সম্ভবত আমার অ্যাডাব্লিক সংস্করণের কারণে :),

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

আপনার উত্তর, মন্তব্য এবং সহায়তার জন্য আপনাকে ধন্যবাদ!


9
এটি আপনার অজানা সংস্করণটির সাথে কোনও সম্পর্ক রাখে না। আপনি উইন্ডোজে নিজের পরীক্ষার ফাইলটি তৈরি করেছেন তাই আপনি যেই সরঞ্জামটি ব্যবহার করেছিলেন প্রতিটি লাইনের শেষদিকে নিয়ন্ত্রণ-এমস যুক্ত করে রেখেছিলেন তাই প্রতিটি লাইনের শেষ ক্ষেত্রটি হ'ল ClNonZ<control-M>না ClNonZকেন গ্রীপ বা "~" এর সাথে সম্পন্ন হিসাবে আংশিক মিলের তুলনা করা হচ্ছে "অজানাতে এটি সন্ধান করে তবে একটি সমতার তুলনা হয় না।
— এড মর্টন

2
হ্যাঁ, বোধগম্য। আমি $ ডস 2 ইউনিক্স পরীক্ষা চেষ্টা করেছি এবং তারপরে "=" প্রতিস্থাপন করতে "==" ব্যবহার করেছি এবং এটি কার্যকর হয় works ব্যাখ্যার জন্য ধন্যবাদ!
— user1687130

-3

এই চেষ্টা করুন

echo $VAR | grep ClNonZ | awk '{print $3}';

অথবা

echo cat filename | grep ClNonZ | awk '{print $3}';

দুঃখের বিষয় এই উত্তরটি সত্যই অবরুদ্ধ সিনট্যাক্স ব্যবহার করে না যা ব্যবহারকারীরা বিশেষত জিজ্ঞাসা করেছিলেন!
— আসফান্দ কাজী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.