GNU awk (comunemente presente sui sistemi Linux), dalla versione 4.1.0, è in grado di includere un "awk libreria sorgente" con -i o --include sulla riga di comando. Una delle librerie sorgente distribuita con GNU awk è uno chiamato inplace :
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Come puoi vedere, questo rende l'output del awk codice sostituire il file di input. La riga che dice there non viene mantenuto in quanto non viene emesso dal programma.
Con un awk script in un file, lo useresti come
awk -i inplace -f script.awk datafile
Se awk variabile INPLACE_SUFFIX è impostato su una stringa, la libreria eseguirà un backup del file originale con quello come suffisso del nome file.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Se si dispone di più file di input, ogni file deve essere modificato individualmente sul posto. Ma puoi disattivare la modifica sul posto per un file (o un insieme di file) utilizzando inplace=0 sulla riga di comando prima di quel file:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Nel comando precedente, file3 non verrebbero modificati sul posto.
Per una "modifica sul posto" più portabile di un singolo file, usa
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Questo copierebbe il file di input in una posizione temporanea, quindi applicherebbe il awk codice sul file temporaneo durante il reindirizzamento al nome file originale.
Eseguendo le operazioni in questo ordine (eseguendo awk sul file temporaneo, non sul file originale) garantisce che i metadati del file (autorizzazioni e proprietà) del file originale non vengano modificati.
Prova questo.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- reindirizza l'output a un file temporaneo.
- quindi sposta il contenuto del file temporaneo nel file originale.