स्तंभ मान स्थितियों के साथ awk का उपयोग करना


108

मैं AWK प्रोग्रामिंग लैंग्वेज से awk सीख रहा हूं और मुझे एक उदाहरण के साथ एक समस्या है।

अगर मैं $ 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

मैं यह देखने की उम्मीद करता हूं कि यह $ 3 है जो उनके $ 8 में "ClNonZ" है।

0.180467091 
0.010615711 
0.492569002

पता नहीं क्यों awk कमांड कुछ भी वापस नहीं किया। कोई विचार?


आपको स्ट्रिंग मान "फाइंडटेक्स्ट" को उद्धृत करने की आवश्यकता है, अन्यथा यह एक चर नाम है
बुराई otto

मैंने "खोज" के साथ दोहरे उद्धरणों की कोशिश की, लेकिन यह काम नहीं करता है .. इसीलिए यह मुझे परेशान करता है
user1687130

1
"काम नहीं करता है" हमें कुछ भी नहीं बताता है। हमें सटीक इनपुट, सटीक कोड, अपेक्षित आउटपुट और वास्तविक आउटपुट दिखाएं।
चेपनर

जवाबों:


128

यदि आप एक विशेष स्ट्रिंग की तलाश कर रहे हैं, तो इसके चारों ओर उद्धरण डालें:

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

अन्यथा, awk मान लेंगे कि यह एक चर नाम है।


मैंने यह कोशिश की, लेकिन यह काम नहीं करता मुझे पता नहीं क्यों। मैंने grep के साथ डबल चेक किया और टेक्स्ट वहां था। :(
user1687130

1
@ user1687130, मुझे लगता है कि आपको हमें कुछ उदाहरण इनपुट और अपेक्षित आउटपुट दिखाने की आवश्यकता है।
कार्ल नॉरम

1
क्या आप सुनिश्चित हैं कि आपका डेटा स्थान-पृथक है। उन स्थानों में से कुछ टैब हो सकता है? एक क्षेत्र को प्रतिध्वनित करने के लिए awk का उपयोग करने का प्रयास करें। है awk '{ print $8 }'आप दे आपकी आशा?
रॉब डेविस

1
यह AWKकार्यान्वयन के कारण हो सकता है (इसके साथ जांच करें awk --version), मेरे जवाब पर एक नज़र है, यह GAWKऔर MAWKभी काम करता है।
arutaku

जब हम awk स्क्रिप्ट के आसपास दोहरे उद्धरण चिह्नों का उपयोग करते हैं तो यह काम नहीं करता है। जैसेawk "$1 == \"findtext\" {print $3}"
तिरुपति थंगावल

33

यह विधि regexp का उपयोग करती है, इसे काम करना चाहिए:

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

धन्यवाद मैं डायपर के तरीकों और grep का उपयोग किए बिना $ NF पर रेगेक्स खोजने के लिए awk का उपयोग करने का एक तरीका खोज रहा था ^ ^
थिबॉल्ट लोइसन

20

AWKकार्यान्वयन के आधार पर आप उपयोग कर रहे हैं ==ठीक है या नहीं।

क्या आपने कोशिश की है ~? उदाहरण के लिए, यदि आप $ 1 को "हैलो" चाहते हैं:

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

^$ 1 प्रारंभ का मतलब है, और $$ 1 अंत है।


4
सभी awk कार्यान्वयन "==" और "~" दोनों का समर्थन करते हैं।
एड मॉर्टन

2
@EdMorton - OS X के awkसाथ मेल करने में विफल रहा ==, लेकिन इसके साथ सफल रहा ~
jww

2
@jww क्या साथ मैच करने में विफल रहा? ये बराबर हैं: $1 == "hello"और $1 ~ /^hello$/। आपको $1 ~ "^hello$"इस उत्तर में कभी भी ऐसा नहीं दिखाया जाना चाहिए क्योंकि यह एक रिगैक्स संदर्भ में एक स्ट्रिंग का उपयोग कर रहा है और इसलिए जाग को उपयोग करने से पहले स्ट्रिंग को एक रेक्सएक्सपी में बदलना होगा और इसके साइड-इफेक्ट्स (मैन ऑक) हैं।
एड मॉर्टन

4

यह मेरे लिए अधिक पठनीय है

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

2

मेरा awk संस्करण 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 संस्करण के कारण :),

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

आपके उत्तर, टिप्पणी और मदद के लिए आप सभी का धन्यवाद!


9
यह आपके जाग संस्करण के साथ कुछ नहीं करना है। आपने विंडोज पर अपनी परीक्षण फ़ाइल बनाई है, इसलिए जो भी उपकरण आप उपयोग करते थे, वह प्रत्येक पंक्ति के अंतिम भाग के लिए लागू किया गया था, इसलिए प्रत्येक पंक्ति पर अंतिम फ़ील्ड है ClNonZ<control-M>, ClNonZयही वजह है कि एक आंशिक मिलान की तुलना grep या "~ "जाग में यह पाता है, लेकिन एक समानता की तुलना नहीं करता है।
एड मॉर्टन

2
हाँ, समझ में आता है। मैंने $ dos2unix परीक्षण की कोशिश की और फिर "==" का उपयोग "~" को बदलने के लिए किया और यह काम करता है। स्पष्टीकरण के लिए धन्यवाद!
user1687130

-3

कृपया यह प्रयास करें

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

या

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

अफसोस की बात है कि यह जवाब वास्तव में अवाक सिंटैक्स का उपयोग नहीं करता है जो उपयोगकर्ता ने विशेष रूप से मांगा है!
असफंद काजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.