:का दूसरा नाम है 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इसके बजाय इसे पढ़ते हैं, तो समझना आसान हो सकता है ।