निम्नलिखित आदेश दिए गए:
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 के उत्तर में अच्छा वाक्यविन्यास है ...