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 singlaawk
jest 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, awk
któ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 awk
sobie, ponieważ awk inny niż GNU nie ma inplace
takiej opcji.
UWAGA: Dlaczegobash
dodaję 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 awk
poleceniu przetworzyłoby kolejno wszystkie pliki (lub coś podobnego)?
awk {..} file1 .. fileX
zapisem zmodyfikowanego pliku, ponieważ np. temp01
W następnej iteracji podczas przetwarzania następnego pliku użyj a, mv -f tmp01 input01
aby zastąpić plik wejściowy zmodyfikowanymi danymi; lub (2) po prostu napisz nowy katalog ./tmp/tmp01 ... ./tmp/tmp0X
podczas wykonywania awk
skryptu i kontynuuj z pętlą nad plikami w ./tmp
katalogu i np. mv -f "$i" "input_${i##*[^0-9]}"
(lub jakimkolwiek rozszerzeniem potrzebnym do zastąpienia starych plików wejściowych.
awk
peł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.