Mi sono imbattuto in una domanda (su SO stesso) in cui OP deve eseguire le operazioni di modifica e salvataggio in Input_file (s) stesso.
So che per un singolo Input_file potremmo fare quanto segue:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Ora supponiamo che dobbiamo apportare modifiche nello stesso tipo di formato di file (supponiamo qui .txt).
Cosa ho provato / pensato per questo problema: il suo approccio sta attraversando un ciclo for di file .txt e chiamare singleawk
è un processo doloroso e NON raccomandato, poiché sprecherà cicli inutili di CPU e per un numero maggiore di file sarebbe più lento.
Quindi cosa potrebbe essere fatto qui per eseguire la modifica inplace per più file con un NON GNU awk
che non supporta l'opzione inplace. Ho anche attraversato questo thread Salva le modifiche in atto con awk ma non c'è molto per il vice awk NON GNU e la modifica di più file all'interno di awk
se stesso, poiché un awk non GNU non avrà alcuna inplace
opzione.
NOTA: Perché sto aggiungendo unbash
tag poiché, nella mia parte di risposta, ho usato i comandi bash per rinominare i file temporanei con i loro nomi effettivi Input_file, quindi aggiungendolo.
EDIT: Secondo il commento di Ed sir che aggiunge un esempio di esempi qui, sebbene lo scopo del codice di questo thread possa essere usato anche per scopi generici di modifica sul posto.
File di input di esempio:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Esempio di output previsto:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
, (forse in una subshell) o in un {...}
gruppo chiuso e quindi scrivere i risultati nel file di output desiderato (sia per ogni file di input, o un file combinato per tutti i file di input). Quindi reindirizzi semplicemente l'output della subshell o del gruppo racchiuso tra parentesi graffe al file corrente su cui stai scrivendo? Includere semplicemente una stringa di file di input a seguito del awk
comando elabora in sequenza tutti i file (o qualcosa di simile) ??
awk {..} file1 .. fileX
scrivere il file modificato come, ad estemp01
e nella prossima iterazione durante l'elaborazione del file successivo, usare a mv -f tmp01 input01
per sovrascrivere il file di input con i dati modificati; oppure (2) scrivere semplicemente una nuova directory ./tmp/tmp01 ... ./tmp/tmp0X
durante l'esecuzione dello awk
script e seguire con un ciclo i file nella ./tmp
directory e, ad esempio mv -f "$i" "input_${i##*[^0-9]}"
(o qualunque espansione sia necessaria per sostituire i vecchi file di input.
awk
il completamento completo del codice, la seconda opzione è quasi la stessa che sto usando nel mio suggerimento le sarei grato se potesse far conoscere i tuoi pensieri su quella soluzione, signore.