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.