:
का दूसरा नाम है true
। दोनों बैश में शेल बिल्ड हैं, लेकिन कोई नहीं है /bin/:
, केवल ए /bin/true
। आउटपुट पुनर्निर्देशन open(2)
फ़ाइल के साथ शेल का कारण बनता है O_CREAT|O_TRUNC
। अगर कुछ नहीं लिखा है, तो यह शून्य लंबाई पर रहता है।
उन दो टुकड़ों को एक साथ :> file
रखना, फाइलों को रौंदने के लिए एक बहुत ही सामान्य मुहावरा है। : >file
हालांकि, ज्यादातर लोग इसे लिखकर कम अजीब दिखने की कोशिश करेंगे ।
चूंकि आपने दूसरी पंक्ति के बारे में टिप्पणी में पूछा था, इसलिए मैं अपनी टिप्पणियों को उत्तर में बदल दूंगा। (हालांकि आपने अपने प्रश्न में यह नहीं पूछा था।)
दूसरी पंक्ति एक लूप है जो otherfile
कुछ नामित चर में से लाइनों को पढ़ती है । लूप बॉडी echo
उन्हें ;
पहले जो भी व्हाट्सएप के बजाय सेपरेटर के साथ प्रिंट करने के लिए उपयोग करती है । file
बंद किया गया है और प्रत्येक पुनरावृत्ति के लिए फिर से खोला गया है, क्योंकि पुनर्निर्देशन लूप के अंदर है। का उपयोग while ...;do read -r ...;done <otherfile >file
कम चूसना होगा, और पहले फ़ाइल को छोटा करने की आवश्यकता से बचें। भागने के पात्र के रूप में read -r
नहीं खाते \
।
बैश में टेक्स्ट प्रोसेसिंग काफी धीमी है। इसका एक हिस्सा अपरिहार्य है: एक पंक्ति के अंत की निगरानी से बचने के लिए read
एक बार में एक बाइट (एक read(2)
सिस्टम कॉल प्रति बाइट) पर जाना पड़ता है । नौकरी के लिए सही टूल का उपयोग करना बेहतर होगा:
awk -vOFS=';' '{ print $1, $2, $4, $5, $3 }' -- otherfile >file
--
इसका मतलब यह है कि अगर आपकी स्क्रिप्ट को तोड़ otherfile
दिया जाता है तो इसका नाम मूर्खतापूर्ण है --version
।
आउटपुट फ़ील्ड विभाजक सेट करने का ;
मतलब है कि आप प्रिंट करने के लिए कई फ़ील्ड पास कर सकते हैं। शेल, read
व्हॉट्सएप के साथ बाकी की पूरी लाइन को आखिरी वेरिएबल में असाइन करता है, लेकिन केवल 5 में विभाजित करने के लिए awk को बताने का कोई तरीका नहीं है। यदि यह महत्वपूर्ण है, तो शायद बस बैश लूप का उपयोग करते रहें, क्योंकि यह awk में असुविधाजनक है। पर्ल यह आसान बनाता है, क्योंकि split
यह एक अधिकतम-फ़ील्ड आर्ग ले सकता है, लेकिन यह जाग की तुलना में शुरू करने के लिए बहुत धीमा है।
वास्तव में, यह इतना कठिन नहीं था, लिखने के लिए सिर्फ एक बदसूरत रेगेक्स। $5
जागने के बजाय रेस्ट-ऑफ-द-लाइन प्राप्त करने के लिए , खेतों पर लूपिंग अभी भी अपने मूल व्हाट्सएप को खो देता है। मेरा पहला व्यवहार्य विचार का उपयोग करने के लिए है gensub
पर $0
, (पूरे लाइन) पहले 4 क्षेत्रों को दूर करने (यानी गैर अंतरिक्ष अंतरिक्ष के बाद) और सब कुछ छोड़ने:
awk -vOFS=';' '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1); print $1, $2, $4, tail, $3 }' -- otherfile >file
मुझे यह पहली कोशिश में सही लगा, लेकिन इस तथ्य से कि मैं खुद से प्रभावित था, उस awk कोड की पठनीयता के बारे में कुछ कहता है। >। <
ध्यान दें कि यह print
पहले की तरह ही कैसा है , लेकिन tail
इसके स्थान पर है $5
।
echo 'A B c DD e f g f' |
awk -vOFS=\; '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1);
print $1, $2, $4, tail, $3 }'
A;B;DD;e f g f;c
यह अधिक प्रभावशाली होगा यदि मैं शाब्दिक रूप से कॉपी / पेस्ट कर सकता हूं और दिखा सकता हूं कि यह आउटपुट में आया है। ^ Q के साथ बैश में एक टाइप करें। ctrl-Q का मतलब है कि अगले कुंजीपट को एक शाब्दिक चरित्र के रूप में उद्धृत करें, क्योंकि बैश के इमैक-स्टाइल लाइन का संपादन इसके लिए वास्तविक एमएसीएस के समान है।
http://mywiki.wooledge.org/BashFAQ में स्क्रिप्टिंग के बारे में कुछ उपयोगी चीजें हैं जो किसी भी चीज को नहीं तोड़ेंगी जो आप स्क्रिप्ट पर फेंकते हैं।
:>
एक भी ऑपरेटर नहीं है। यदि आप: > file
इसके बजाय इसे पढ़ते हैं, तो समझना आसान हो सकता है ।