2011-02-10 12 views
5

क्यों इस awk स्क्रिप्ट:Awk क्षेत्र विभाजक व्यवहार

awk '{FS = "\t" ; print $1 " - " $2}' A.txt 

इस इनपुट फ़ाइल के साथ a.txt

B A A1 
C B A2 
D A A3 

इन परिणामों आउटपुट

B - A 
C B - A2 
D A - A3 

ध्यान दें कि पहले बी और एक के बीच एक जगह है और एक टैब चरित्र नहीं है। मैंने इस

+1

'awk -F "\ t"' {print $ 1 "-" $ 2} 'A.txt' के आउटपुट के साथ तुलना करें - सभी तीन पंक्तियों में पैटर्न समान है। तो आपके 'एफएस' का केवल एटीटीटी की पहली पंक्ति पर प्रभाव पड़ता है। – eumiro

उत्तर

7

को दो बार चेक किया है, मुझे विश्वास है क्योंकि यह पहली कार्रवाई में एफएस सेट किया जा रहा है। पहली क्रिया लागू होने से पहले, पहली पंक्ति का विभाजन पहले ही किया जा चुका है, और यह डिफ़ॉल्ट एफएस (व्हाइटस्पेस) का उपयोग करता है।

तो इसे सुसंगत बनाने के लिए, आपको -F विकल्प के साथ आमंत्रित करना चाहिए।

0

यदि आप बीच में जगह नहीं डालते हैं, तो बस स्ट्रिंग को संयोजित करता है।

परिवर्तन

print $1, " - ", $2 

भी आप शायद उत्पादन के लिए ओएफएस सेट करना चाहते हैं कमांड

+0

मदद नहीं की, एक ही बात –

7

सही तरीका है:

BEGIN {FS = "\t"} 
{ print $1 " - " $2} 

आप के बाद एफएस बहुत देर हो चुकी (सेट कर रहे हैं पहली पंक्ति विभाजित है)

2

सबसे पहले, आप परिवर्तनीय एफएस प्रत्येक पंक्ति को बदल रहे हैं; आप शायद एक बार इसे बदलने का इरादा रखते हैं। इसके अलावा, अगर आप एफएस को बदलना चाहते हैं, तो शायद आप किसी भी लाइन को पार्स किए जाने से पहले इसे बदलना चाहते हैं। POSIX के लिए आवश्यक है कि एफएस में कोई भी परिवर्तन केवल अगली लाइन के पार्सिंग को प्रभावित करेगा। (कई कार्यान्वयन अभी तक उस आवश्यकता के अनुरूप नहीं हैं, और मौजूदा लाइन के लिए एफएस के परिवर्तित मूल्य का उपयोग कर सकते हैं यदि वर्तमान लाइन अभी तक पार्स नहीं किया गया है।) इन दोनों मुद्दों को हल करने के लिए, आपको इस तरह के एफएस को बदलना चाहिए:

awk 'BEGIN { FS="\t" } {...}' A.txt 

या इस:

awk -v 'FS=\t' '{...}' A.txt 

(। वहाँ भी -v 'FS=\t' के बजाय -F '\t' का उपयोग कर एक रूप है, लेकिन awk के कुछ कार्यान्वयन पूर्व निर्माण में सी-भागने \t सम्मान नहीं होगा)

बी ध्यान दें कि एफएस इनपुट डेटा के विश्लेषण को नियंत्रित करता है, जबकि ओएफएस आउटपुट डेटा के विश्लेषण को नियंत्रित करता है। यह आपके प्रश्न से स्पष्ट नहीं है जिसे आप करना चाहते हैं। पहली नज़र में, आपका इनपुट डेटा ऐसा नहीं लगता है कि इसमें कोई टैब है, इसलिए आप शायद एफएस को इसके डिफ़ॉल्ट मान पर छोड़ना चाहते हैं।

यदि आप आउटपुट स्वरूपण को बदलना चाहते हैं, तो आप ओएसएस को "\ t" पर सेट कर सकते हैं, जिसे हमने अभी भी एफएस के लिए वर्णित किया है। यह स्पष्ट नहीं है कि आप यही चाहते हैं, हालांकि, क्योंकि आप अपनी टेस्ट स्क्रिप्ट में ओएफएस का कोई उपयोग नहीं कर रहे हैं। जब आप कहते हैं: "-" और $ 2

print $1 " - " $2 

आप एक ही तर्क है, जो $ 1 के संयोजन और है मुद्रण कर रहे हैं।ओएफएस का इस्तेमाल करते हैं करने के लिए, अगर आप इस तरह कई तर्क है, जो एक अल्पविराम से अलग किया जाएगा --- उदाहरण के लिए मुद्रित करने के लिए होगा:

print $1, $2 

पहेली खेलना, मैं नमूना डेटा और आप उत्पादन वर्तमान में फिर से देखो । हो सकता है कि आपके नमूना डेटा में वास्तव में प्रारूप हो: B<space>A<tab>A1, और शायद आप करें एफएस सेट करने का इरादा रखते हैं ताकि B<space>A $ 1 में और A1 $ 2 में हथियाने के लिए किया जा सके। यदि यह सही है, तो बस किसी भी लाइन-प्रसंस्करण शुरू होने से पहले, सही समय पर एफएस सेट करना सुनिश्चित करें। तब आपकी स्क्रिप्ट को काम करना चाहिए इससे कोई फर्क नहीं पड़ता कि आप किस अजीब कार्यान्वयन का उपयोग करते हैं।