जाग क्षेत्र विभाजक के रूप में ":" का उपयोग कैसे करें?


243

निम्नलिखित आदेश दिए गए:

echo "1: " | awk '/1/ -F ":" {print $1}'

awk आउटपुट क्यों होता है:

1: 

जवाबों:


382

"-F" एक कमांड लाइन तर्क है जो वाक्यविन्यास नहीं जगाता है, कोशिश करें:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
यहाँ अज्ञानी का प्रश्न: / १ / भाग केवल प्रक्रिया को बताने के लिए अजीब है (या रिकॉर्ड अधिक सटीक होने के लिए) जिसमें नंबर १ सही हो?
रांथ

3
@antsh अक्क वाक्यविन्यास जैसा दिखता है (pattern){action}। यदि pattern(अधिकतर सशर्त कथन) सत्य है , actionतो निष्पादित किया जाता है। यदि patternउपलब्ध नहीं है, trueतो निहित है। यहाँ वह patternहै /1/जो वर्तमान रिकॉर्ड में रेगेक्स से 1मेल खाता है$0
क्वांटौर

62

यदि आप इसे प्रोग्रामेटिक रूप से करना चाहते हैं, तो आप FSवैरिएबल का उपयोग कर सकते हैं :

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

ध्यान दें कि यदि आप इसे लूप के बजाय मुख्य लूप में बदलते हैं BEGIN, तो यह अगली लाइन में पढ़ने के लिए प्रभावित करता है, क्योंकि वर्तमान लाइन पहले ही विभाजित हो चुकी है।


35

आपके पास :विभाजक के रूप में सेट करने के कई तरीके हैं :

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

उनमें से सभी समकक्ष हैं और 1एक नमूना इनपुट "1: 2: 3" के लिए वापस आ जाएगा :

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

पसंदीदा तरीका कौन सा है? मुझे लगता है कि BEGINकथन के साथ अंतिम उदाहरण सबसे सही होगा (समग्र awkवाक्य रचना के अनुरूप )।

1
@randomware सब ठीक हैं। मैं का उपयोग करते हैं BEGINअगर मैं एक फ़ाइल का उपयोग पूरी बात स्टोर करने के लिए, जबकि -Fएक-लाइनर्स के साथ काम में आता।
फेडोरक्वी 'एसओ

1
यह कहना होगा कि तीसरे मामले और अन्य सभी के बीच सूक्ष्म अंतर हैं। उदाहरण: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileऔरawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file


12

-Fअपने आप में एक तर्क awkहै:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
बृहदान्त्र को उद्धृत करने की आवश्यकता नहीं है।
छत

6

आप फ़ील्ड विभाजक के रूप में एक रेगेक्स का भी उपयोग कर सकते हैं, निम्नलिखित "बार" को एक विभाजक के रूप में "10" संख्या को सेट करने के लिए "बार" प्रिंट करेगा।

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

इसको ज्यादा लिखने की जरूरत नहीं। बस अपने इच्छित क्षेत्र विभाजक को -F विकल्प के साथ awk कमांड में रखें और कॉलम संख्या जिसे आप अपने उल्लेखित विभाजक के अनुसार अलग करना चाहते हैं।

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWK टेक्स्ट इंटरप्रेटर के रूप में काम करता है जो पूरे दस्तावेज़ के लिए लाइनवाइज़ जाता है और जो प्रत्येक पंक्ति के लिए फ़ील्डवाइज़ जाता है , इस प्रकार $ 1, $ 2 .. $ n प्रत्येक पंक्ति के क्षेत्रों के संदर्भ हैं ($ 1 पहला फ़ील्ड है, $ 2 दूसरा फ़ील्ड है और इसी तरह) ...)। आप कमांड लाइन के तहत या "FS = ..." के साथ दो कोष्ठक के भीतर "-F" स्विच का उपयोग करके एक क्षेत्र विभाजक को परिभाषित कर सकते हैं। अब "जुरेन" के उत्तर पर विचार करें:

echo "1: " | awk -F  ":" '/1/ {print $1}'

फ़ील्ड सीमाओं के ऊपर ":" है, इसलिए हमारे पास दो फ़ील्ड $ 1 है जो "1" है और $ 2 जो कि खाली जगह है। इसके बाद, नियमित अभिव्यक्ति आती है "/ 1 /" जो फ़िल्टर को केवल पहले फ़ील्ड को आउटपुट करने के लिए निर्देश देती है। जब दुभाषिया ऐसी अभिव्यक्ति वाली रेखा पर ठोकर खाता है (मेरा मतलब 1); "इको" कमांड का आउटपुट एक लाइन है जिसमें "1" शामिल है इसलिए फ़िल्टर काम करेगा ...

निम्नलिखित उदाहरण के साथ काम करते समय:

echo "1: " | awk '/1/ -F ":" {print $1}'

वाक्यविन्यास गड़बड़ है और दुभाषिया ने भाग एफ को अनदेखा करने के लिए चुना ":" और डिफ़ॉल्ट फ़ील्ड स्प्लिटर पर स्विच करता है जो इस प्रकार खाली स्थान है जो "1:" को पहले फ़ील्ड के रूप में आउटपुट करता है और दूसरा फ़ील्ड नहीं होगा!

JUERGEN के उत्तर में अच्छा वाक्यविन्यास है ...


2

या आप उपयोग कर सकते हैं:

echo "1: " | awk  '/1/{print $1-":"}' 

यह वास्तव में अजीब समीकरण है।


1
क्या /1/मतलब है?

एक पैटर्न खोजें। इस मामले में "1"
जोस डायस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.