मुझे एक प्रश्न (SO पर ही) आया है, जहाँ OP को स्वयं इनपुट_फाइल (s) में ऑपरेशन को संपादित और सहेजना है।
मैं एक एकल इनपुट_फाइल के लिए जानता हूं जो हम निम्नलिखित कर सकते हैं:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
अब हम कहते हैं कि हमें एक ही तरह की फ़ाइलों के प्रारूप में परिवर्तन करने की आवश्यकता है (मान लें। यहाँ क्लिक करें)।
मैंने इस समस्या के लिए क्या सोचा / सोचा है: इसका दृष्टिकोण .txt फ़ाइलों के लूप से गुजर रहा है और सिंगल कॉलिंगawkएक दर्दनाक और अनुशंसित प्रक्रिया नहीं है, क्योंकि यह अनावश्यक सीपीयू चक्रों को बेकार कर देगा और अधिक संख्या में फ़ाइलों के लिए अधिक होगा धीमी गति से।
तो संभवतः एक गैर GNU के साथ कई फ़ाइलों के लिए inplace edit करने के लिए यहाँ क्या किया जा सकता है awkजो inplace विकल्प का समर्थन नहीं करता है। मैं थ्रेड के साथ इस थ्रेड सेव संशोधनों में भी जा चुका हूं, लेकिन गैर GNU awk वाइस के लिए ज्यादा कुछ नहीं है और कई फाइलों को awkअपने भीतर बदल रहा है, क्योंकि एक गैर GNU awk के पास इसका inplaceविकल्प नहीं होगा ।
ध्यान दें: मैंbashकब से टैगजोड़ रहा हूं, मेरे उत्तर भाग में मैंने अस्थायी फ़ाइलों का नाम बदलकर उनके वास्तविक Input_file नामों में नाम जोड़ने के लिए bash कमांड का उपयोग किया है।
EDIT: एड सर की टिप्पणी के अनुसार, यहाँ नमूनों का एक उदाहरण है, हालाँकि इस थ्रेड कोड का उपयोग सामान्य प्रयोजन के द्वारा भी किया जा सकता है।
नमूना Input_file (s):
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
अपेक्षित उत्पादन का नमूना:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk, तो (शायद एक उपखंड में) या एक {...}संलग्न समूह के लिए एक कॉल का उपयोग क्यों न करें और फिर वांछित आउटपुट फ़ाइल (प्रत्येक इनपुट फ़ाइल के लिए, या तो परिणाम लिखें) या सभी इनपुट फ़ाइलों के लिए एक संयुक्त फ़ाइल)। तब आप केवल वर्तमान फ़ाइल में सब्स्क्रिप्शन या ब्रेस-एनक्लोज्ड ग्रुप के आउटपुट को रीडायरेक्ट करते हैं? बस इनपुट फ़ाइलों की एक स्ट्रिंग सहित awkकमांड के बाद क्रमिक रूप से सभी फाइलों (या कुछ इसी तरह) की प्रक्रिया होगी ??
awk {..} file1 .. fileXसंशोधित फ़ाइल लिखने के साथ 2 विकल्प (1) देखता हूं , जैसे कि temp01और अगली फ़ाइल को संसाधित करते समय आपकी अगली पुनरावृत्ति में, mv -f tmp01 input01संशोधित डेटा के साथ इनपुट फ़ाइल को अधिलेखित करने के लिए; या (2) बस स्क्रिप्ट ./tmp/tmp01 ... ./tmp/tmp0Xके निष्पादन के दौरान एक नई निर्देशिका लिखें और निर्देशिका awkमें फ़ाइलों पर एक लूप के साथ अनुवर्ती करें ./tmpऔर, उदाहरण के लिए mv -f "$i" "input_${i##*[^0-9]}"(या जो भी विस्तार आपको पुरानी इनपुट फ़ाइलों को बदलने की आवश्यकता है।
awkपूरा कर रहे हैं पूरा कोड, दूसरा विकल्प लगभग वही है जो मैं अपने सुझाव में उपयोग कर रहा हूं, आभारी रहें यदि आप उस समाधान पर अपने विचार बता सकते हैं।