Tôi đã bắt gặp một câu hỏi (trên chính SO) trong đó OP phải thực hiện chỉnh sửa và lưu hoạt động vào chính Input_file (s).
Tôi biết với một Input_file duy nhất chúng ta có thể làm như sau:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Bây giờ hãy nói rằng chúng ta cần thực hiện các thay đổi trong cùng loại định dạng của tệp (giả sử .txt ở đây).
Những gì tôi đã cố gắng / nghĩ cho vấn đề này: Cách tiếp cận của nó là trải qua một vòng lặp các tệp .txt và gọi đơnawk
là một quá trình đau đớn và KHÔNG được đề xuất, vì nó sẽ lãng phí các chu kỳ cpu không cần thiết và với số lượng tệp nhiều hơn sẽ nhiều hơn chậm
Vì vậy, những gì có thể được thực hiện ở đây để thực hiện chỉnh sửa tại chỗ cho nhiều tệp với NON GNU awk
không hỗ trợ tùy chọn tại chỗ. Tôi cũng đã trải qua chủ đề này Lưu các sửa đổi tại chỗ với awk nhưng không có gì nhiều cho NON GNU awk vice và thay đổi nhiều tệp trong awk
đó, vì một awk GNU không có inplace
tùy chọn này.
LƯU Ý: Tại sao tôi thêmbash
thẻ vì trong phần trả lời của tôi, tôi đã sử dụng các lệnh bash để đổi tên các tệp tạm thời thành tên Input_file thực tế của chúng để thêm nó.
EDIT: Theo nhận xét của Ed, thêm một ví dụ về các mẫu ở đây, mặc dù mục đích của mã của chủ đề này cũng có thể được sử dụng cho mục đích chung là chỉnh sửa tại chỗ.
Mẫu Input_file (s):
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Mẫu sản lượng dự kiến:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
, (có thể trong một mạng con) hoặc một {...}
nhóm kèm theo và sau đó ghi kết quả vào tệp đầu ra mong muốn (cho mỗi tệp đầu vào, hoặc một tệp kết hợp cho tất cả các tệp đầu vào). Sau đó, bạn chỉ cần chuyển hướng đầu ra của nhóm con hoặc nhóm được đóng dấu vào tệp hiện tại đang được ghi vào? Đơn giản chỉ cần bao gồm một chuỗi các tệp đầu vào theo awk
lệnh sẽ xử lý tuần tự tất cả các tệp (hoặc một cái gì đó tương tự) ??
awk {..} file1 .. fileX
ghi tệp đã sửa đổi là, ví dụ temp01
và trong lần lặp tiếp theo của bạn trong khi xử lý tệp tiếp theo, hãy sử dụng mv -f tmp01 input01
ghi đè lên tệp đầu vào với dữ liệu đã sửa đổi; hoặc (2) chỉ cần viết một thư mục mới ./tmp/tmp01 ... ./tmp/tmp0X
trong quá trình thực thi awk
tập lệnh và theo dõi với một vòng lặp trên các tệp trong ./tmp
thư mục và, ví dụ mv -f "$i" "input_${i##*[^0-9]}"
(hoặc bất kỳ bản mở rộng nào bạn cần để thay thế các tệp đầu vào cũ.
awk
hoàn thành mã hoàn chỉnh, tùy chọn thứ 2 gần giống với những gì tôi đang sử dụng trong đề xuất của mình, sẽ hãy biết ơn nếu bạn có thể cho những suy nghĩ của bạn biết về giải pháp đó thưa ông.