Natknąłem się na pytanie (na samym SO), w którym OP musi dokonać edycji i zapisać operację w samych plikach wejściowych.
Wiem, że dla jednego pliku wejściowego możemy wykonać następujące czynności:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Powiedzmy teraz, że musimy wprowadzić zmiany w tym samym formacie plików (załóżmy tutaj .txt).
Co próbowałem / pomyślałem o tym problemie: jego podejście polega na przechodzeniu przez pętlę for plików .txt i wywoływanie singlaawkjest bolesnym i NIE zalecanym procesem, ponieważ marnuje zbędne cykle procesora, a dla większej liczby plików byłoby więcej powolny.
Co więc można zrobić tutaj, aby przeprowadzić edycję w miejscu dla wielu plików z NON GNU, awkktóry nie obsługuje opcji inplace. Przeszedłem również przez ten wątek. Zapisz modyfikacje za pomocą awk, ale nic nie ma na imadło NON GNU awk i zmiana wielu plików w awksobie, ponieważ awk inny niż GNU nie ma inplacetakiej opcji.
UWAGA: Dlaczegobashdodaję znacznik, ponieważ w części z odpowiedziami użyłem poleceń bash, aby zmienić nazwy plików tymczasowych na ich rzeczywiste nazwy pliku_wejściowego, więc dodając go.
EDYCJA: Zgodnie z komentarzem Eda, dodając tutaj przykładowy przykład, cel kodu tego wątku może być również użyty do ogólnej edycji w miejscu.
Przykładowe pliki wejściowe:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Próbka oczekiwanej wydajności:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk(być może w podpowłoce) lub {...}zamkniętej grupy, a następnie zapisać wyniki w pożądanym pliku wyjściowym (dla każdego pliku wejściowego, lub połączony plik dla wszystkich plików wejściowych). Następnie przekierowujesz dane wyjściowe grupy otoczki lub grupy nawiasów klamrowych do bieżącego pliku, w którym jest zapisywany? Zwykłe dołączenie ciągu plików wejściowych po awkpoleceniu przetworzyłoby kolejno wszystkie pliki (lub coś podobnego)?
awk {..} file1 .. fileXzapisem zmodyfikowanego pliku, ponieważ np. temp01W następnej iteracji podczas przetwarzania następnego pliku użyj a, mv -f tmp01 input01aby zastąpić plik wejściowy zmodyfikowanymi danymi; lub (2) po prostu napisz nowy katalog ./tmp/tmp01 ... ./tmp/tmp0Xpodczas wykonywania awkskryptu i kontynuuj z pętlą nad plikami w ./tmpkatalogu i np. mv -f "$i" "input_${i##*[^0-9]}"(lub jakimkolwiek rozszerzeniem potrzebnym do zastąpienia starych plików wejściowych.
awkpełnego uzupełnienia kodu, druga opcja jest prawie taka sama, jak używam w mojej sugestii, będzie bądź wdzięczny, jeśli mógłbyś przekazać swoje myśli na temat tego rozwiązania.