কলাম মান শর্তাবলী সঙ্গে 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.