ฉันเจอคำถาม (ในตัวเองดังนั้น) ที่ OP จะต้องแก้ไขและบันทึกการดำเนินการใน Input_file (s) ตัวเอง
ฉันรู้สำหรับ Input_file เดียวที่เราสามารถทำได้:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
ตอนนี้สมมติว่าเราต้องทำการเปลี่ยนแปลงในรูปแบบไฟล์ประเภทเดียวกัน (สมมติว่า. txt ที่นี่)
สิ่งที่ฉันได้ลอง / คิดเกี่ยวกับปัญหานี้:วิธีการของมันคือการผ่านสำหรับไฟล์. txt และการเรียกไฟล์เดี่ยวawkนั้นเป็นกระบวนการที่ไม่เจ็บปวดและไม่แนะนำเนื่องจากมันจะทำให้วงจรซีพียูที่ไม่จำเป็นขาดหายไป ช้า.
ดังนั้นสิ่งที่สามารถทำได้ที่นี่เพื่อทำการแก้ไขแบบ inplace สำหรับหลายไฟล์ด้วย NON GNU awkซึ่งไม่รองรับตัวเลือก inplace ฉันได้ผ่านหัวข้อนี้แล้วบันทึกการแก้ไขด้วย awkแต่ไม่มีอะไรมากสำหรับ NON GNU awk Vice และการเปลี่ยนไฟล์หลาย ๆ ไฟล์ภายในawkตัวเองเนื่องจากไม่ใช่ GNU awk จะไม่มีinplaceตัวเลือก
หมายเหตุ:ทำไมฉันเพิ่มbashแท็กตั้งแต่ในส่วนคำตอบของฉันฉันได้ใช้คำสั่ง bash เพื่อเปลี่ยนชื่อไฟล์ชั่วคราวเป็นชื่อ Input_file จริงของพวกเขาเพื่อเพิ่ม
แก้ไข:ตามความเห็นของเอ็ดเซอร์ที่เพิ่มตัวอย่างของตัวอย่างที่นี่แม้ว่าวัตถุประสงค์ของรหัสของหัวข้อนี้สามารถใช้โดยวัตถุประสงค์ทั่วไปแก้ไขในสถานที่เช่นกัน
ตัวอย่าง Input_file:
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(อาจเป็น subshell) หรือ{...}กลุ่มที่ล้อมรอบแล้วเขียนผลลัพธ์ลงในไฟล์เอาต์พุตที่ต้องการ (ทั้งไฟล์อินพุตแต่ละไฟล์ หรือไฟล์รวมสำหรับไฟล์อินพุตทั้งหมด) จากนั้นคุณเพียงแค่เปลี่ยนเส้นทางเอาต์พุตของกลุ่มย่อยหรือกลุ่มที่อยู่ในวงเล็บปีกกาไปยังไฟล์ปัจจุบันที่กำลังเขียนไป? เพียงรวมสตริงของไฟล์อินพุตที่ทำตามawkคำสั่งตามลำดับจะประมวลผลไฟล์ทั้งหมด (หรือบางอย่างที่คล้ายกัน)?
awk {..} file1 .. fileXเขียนไฟล์ที่แก้ไขเช่นtemp01และในการทำซ้ำครั้งต่อไปของคุณในขณะที่ประมวลผลไฟล์ถัดไปใช้ a mv -f tmp01 input01เพื่อเขียนทับไฟล์อินพุตด้วยข้อมูลที่แก้ไข หรือ (2) เพียงเขียนไดเรกทอรีใหม่ของ./tmp/tmp01 ... ./tmp/tmp0Xในระหว่างการดำเนินการของawkสคริปต์และติดตามด้วยการวนรอบไฟล์ใน./tmpไดเรกทอรีและเช่นmv -f "$i" "input_${i##*[^0-9]}"(หรือการขยายตัวใด ๆ ที่คุณต้องการแทนที่ไฟล์อินพุตเก่า
awkกรอกโค้ดให้สมบูรณ์ตัวเลือกที่ 2 เกือบจะเหมือนกับที่ฉันใช้ในคำแนะนำของฉัน รู้สึกขอบคุณถ้าคุณสามารถบอกความคิดของคุณเกี่ยวกับโซลูชันนั้น