2012-10-23 14 views
5

मेरे पास एक साधारण अजीब एक लाइनर है जो किसी दिए गए पैटर्न से मेल खाने पर अगली पंक्ति को वर्तमान पंक्ति पर जोड़ता है। संदेश यह है:एक पिछली लिपि के शरीर पर पीछे की संख्या का प्रभाव क्या होता है?

awk '/two/ { printf $1; next; } 1' test.txt 
निम्नलिखित इनपुट के साथ

:

one 
two 
three 
four 
five 
six 

one 
two 
three 
four 

आपको मिलेगा:

one 
twothree 
four 
five 
six 

one 
twothree 
four 

ध्यान दें कि "तीन" के साथ "दो" जो है क्या हो रहा मोड़ा जाता है मैं होना चाहता था। मुझे यह समाधान मिला (जहां याद नहीं है) और यह अजीब लगा कि पिछला '1' गायब टुकड़ा प्रतीत होता है जिसके परिणामस्वरूप वांछित प्रभाव होता है। यदि आप इसे बाहर लेते हैं, तो आपको मिलते हैं:

awk '/two/ { printf $1; next; }' test.txt 
twotwo 

परिणामस्वरूप। तो मेरा सवाल यह है कि पिछला '1' क्या करता है, और इसे कहां दस्तावेज किया जाता है?

धन्यवाद!

उत्तर

6

awk के लिए, 1 मतलब सही है, और जब एक अभिव्यक्ति सत्य है, awk डिफ़ॉल्ट रूप से वर्तमान पंक्ति मुद्रित करें।

उदाहरण:

  • awk '1' /etc/passwd पूरी फ़ाइल प्रिंट होगा
  • awk '0' /etc/passwd होगा नहीं प्रिंट पूरी फ़ाइल

यदि आप गणित में अच्छा कर रहे हैं (या आप कल्पना या प्रोग्रामिंग है कौशल), इस व्यवहार के साथ आप कई चाल कर सकते हैं।

3

"पूरे 'एक लाइनर के अंत में" 1' 'संशोधित रेखा को प्रिंट करता है (यह सिर्फ "प्रिंट" के लिए सिंटैक्टिक चीनी है (यह स्वयं "प्रिंट $ 0" के लिए वाक्य रचनात्मक चीनी है) "।

-catonmat

+0

आह! लिंक के लिए धन्यवाद। बहुत उपयोगी। – drsnyder

1

आप अपने विशिष्ट सवाल का जवाब मिल गया है लेकिन अपने पोस्ट स्क्रिप्ट असुरक्षित है। Printf के लिए पहला तर्क एक प्रारूप स्ट्रिंग है, डेटा नहीं। आप कभी-कभी डेटा प्रिंट करने के लिए इसका उपयोग कर सकते हैं, लेकिन केवल तभी जब यह आपकी स्क्रिप्ट में हार्ड-कोड किया गया हो, न कि जब आप इसे इनपुट से पढ़ रहे हों। देखो क्या होता है अपने इनपुट एक printf स्वरूपण स्ट्रिंग को रोकने के लिए होता है अगर:

$ cat file 
one 
two%s 
three 
four 

$ awk '/two/ { printf $1; next; } 1' file 
one 
awk: cmd. line:1: (FILENAME=file2 FNR=2) fatal: not enough arguments to satisfy format string 
     `two%s' 
      ^ran out for this one 

सही तरीका स्क्रिप्ट लिखने के लिए है:

$ awk '/two/ { printf "%s",$1; next; } 1' file 
one 
two%sthree 
four 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^