2014-05-05 7 views
6

यह आदेश काम करता है। यह क्षेत्र विभाजक (इस मामले में, एक अल्पविराम) आउटपुट:एक अजीब फ़ील्ड असाइनमेंट आउटपुट फ़ील्ड सेपरेटर क्यों खो देता है?

$ echo "hi,ho"|awk -F, '/hi/{print $0}' 
hi,ho 

यह आदेश अजीब निर्गम (यह अल्पविराम याद आ रही है) है:

$ echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}' 
hi low 

OFS (उत्पादन क्षेत्र विभाजक) की स्थापना चर एक अल्पविराम के लिए इस मामले को हल करता है, लेकिन यह वास्तव में इस व्यवहार की व्याख्या नहीं करता है।

क्या मैं ओएफएस रखने के लिए awk बता सकता हूं?

उत्तर

10

जब आप सभी स्तंभों को संशोधित लाइन ($0) awk फिर से निर्माणों और उन दोनों के बीच OFS का मूल्य जो डिफ़ॉल्ट रूप से अंतरिक्ष है डालता है। आपने $2 के मान को संशोधित किया है जिसका अर्थ है कि आपने $0 का पुनः मूल्यांकन करने के लिए awk को मजबूर किया है।

जब आप अपने पहले मामले में $0 का उपयोग करते हुए लाइन प्रिंट करते हैं, क्योंकि आपने किसी भी फ़ील्ड को संशोधित नहीं किया है, awk ने प्रत्येक फ़ील्ड का फिर से मूल्यांकन नहीं किया है और इसलिए फील्ड विभाजक संरक्षित है।

क्रम क्षेत्र विभाजक बचाने के लिये, आप निर्दिष्ट कर सकते कि का उपयोग करते हुए:

BEGIN ब्लॉक:

$ echo "hi,ho" | awk -F, -v OFS="," '/hi/{$2="low";print $0}' 
hi,low 

पर निर्धारित करना:

$ echo "hi,ho" | awk 'BEGIN{FS=OFS=","}/hi/{$2="low";print $0}' 
hi,low 

-v विकल्प का उपयोगawk के अंत:

$ echo "hi,ho" | awk -F, '/hi/{$2="low";print $0}' OFS="," 
hi,low 
+2

ओह समय पर वापस जाने के लिए और' एफएस' का अर्थ इनपुट और आउटपुट दोनों "फील्ड सेपरेटर" है और अलग-अलग 'आईएफएस' है 'और उन दुर्लभ मामलों के लिए' ओएफएस 'चर जब आप इनपुट और आउटपुट फील्ड सेपरेटर्स को व्यक्तिगत रूप से सेट करना चाहते हैं। ओह ठीक है .... +1। –

0

अपनी BEGIN कार्रवाई में, OFS = FS सेट करें।

+2

आम तौर पर आप 'एफ ऐसा नहीं होता है, 'शुरू { ओएफएस = एफएस} ..', लेकिन 'BEGIN {OFS = FS = ","} ..' – Jotne

1

आप पहली बार उदाहरण के लिए कुछ भी नहीं बदलता है, इसलिए सभी बाहर इनपुट के रूप में छपा है।
दूसरे उदाहरण में, यह लाइन बदल सकते हैं और यह डिफ़ॉल्ट ओएफएस का उपयोग करेगा, कि (एक अंतरिक्ष)
तो इस पर काबू पाने के लिए है:

echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}' OFS="," 
hi,low 
संबंधित मुद्दे