ฉันเจอคำถาม (ในตัวเองดังนั้น) ที่ 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 เกือบจะเหมือนกับที่ฉันใช้ในคำแนะนำของฉัน รู้สึกขอบคุณถ้าคุณสามารถบอกความคิดของคุณเกี่ยวกับโซลูชันนั้น