GNU awk
(běžně se vyskytuje v systémech Linux), od verze 4.1.0, je schopen zahrnout "awk
zdrojová knihovna" s -i
nebo --include
na příkazovém řádku. Jedna ze zdrojových knihoven, která je distribuována s GNU awk
se nazývá inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Jak můžete vidět, výsledkem je awk
kód nahradit vstupní soubor. Řádek říká there
se neuchová, protože jej program nevypisuje.
S awk
skript v souboru, použijete jej jako
awk -i inplace -f script.awk datafile
Pokud je awk
proměnná INPLACE_SUFFIX
je nastaven na řetězec, pak by knihovna vytvořila zálohu původního souboru s příponou názvu souboru.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Máte-li několik vstupních souborů, pak každý soubor lze individuálně upravit na místě. Úpravy na místě však můžete u souboru (nebo sady souborů) vypnout pomocí inplace=0
na příkazovém řádku před tímto souborem:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Ve výše uvedeném příkazu file3
nebude upraveno na místě.
Pro přenosnější „úpravu na místě“ jednoho souboru použijte
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
To zkopíruje vstupní soubor do dočasného umístění a poté použije awk
kód na dočasném souboru při přesměrování na původní název souboru.
Operace provádějte v tomto pořadí (spuštění awk
na dočasný soubor, nikoli na původní soubor) zajišťuje, že metadata souboru (oprávnění a vlastnictví) původního souboru nebudou změněna.
Zkuste toto.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- přesměrovat výstup do dočasného souboru.
- pak přesuňte obsah dočasného souboru do původního souboru.