निम्नलिखित आदेश दिए गए:
echo "1: " | awk '/1/ -F ":" {print $1}'
awk आउटपुट क्यों होता है:
1:
निम्नलिखित आदेश दिए गए:
echo "1: " | awk '/1/ -F ":" {print $1}'
awk आउटपुट क्यों होता है:
1:
जवाबों:
"-F" एक कमांड लाइन तर्क है जो वाक्यविन्यास नहीं जगाता है, कोशिश करें:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}। यदि pattern(अधिकतर सशर्त कथन) सत्य है , actionतो निष्पादित किया जाता है। यदि patternउपलब्ध नहीं है, trueतो निहित है। यहाँ वह patternहै /1/जो वर्तमान रिकॉर्ड में रेगेक्स से 1मेल खाता है$0
यदि आप इसे प्रोग्रामेटिक रूप से करना चाहते हैं, तो आप FSवैरिएबल का उपयोग कर सकते हैं :
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
ध्यान दें कि यदि आप इसे लूप के बजाय मुख्य लूप में बदलते हैं BEGIN, तो यह अगली लाइन में पढ़ने के लिए प्रभावित करता है, क्योंकि वर्तमान लाइन पहले ही विभाजित हो चुकी है।
आपके पास :विभाजक के रूप में सेट करने के कई तरीके हैं :
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वाक्य रचना के अनुरूप )।
BEGINअगर मैं एक फ़ाइल का उपयोग पूरी बात स्टोर करने के लिए, जबकि -Fएक-लाइनर्स के साथ काम में आता।
awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileऔरawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
इसको ज्यादा लिखने की जरूरत नहीं। बस अपने इच्छित क्षेत्र विभाजक को -F विकल्प के साथ awk कमांड में रखें और कॉलम संख्या जिसे आप अपने उल्लेखित विभाजक के अनुसार अलग करना चाहते हैं।
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
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 के उत्तर में अच्छा वाक्यविन्यास है ...