GNU awk
(couramment trouvé sur les systèmes Linux), depuis la version 4.1.0, est capable d'inclure un "awk
bibliothèque source" avec -i
ou --include
sur la ligne de commande. Une des bibliothèques source distribuée avec GNU awk
est un appelé inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Comme vous pouvez le voir, cela rend la sortie du awk
code remplace le fichier d'entrée. La ligne indiquant there
n'est pas conservé car il n'est pas sorti par le programme.
Avec un awk
script dans un fichier, vous l'utiliseriez comme
awk -i inplace -f script.awk datafile
Si le awk
variables INPLACE_SUFFIX
est défini sur une chaîne, la bibliothèque effectuera une sauvegarde du fichier d'origine avec cela comme suffixe de nom de fichier.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Si vous avez plusieurs fichiers d'entrée, chaque fichier sera édité individuellement sur place. Mais vous pouvez désactiver l'édition sur place pour un fichier (ou un ensemble de fichiers) en utilisant inplace=0
sur la ligne de commande avant ce fichier :
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Dans la commande ci-dessus, file3
ne serait pas modifié sur place.
Pour une "édition sur place" plus portable d'un seul fichier, utilisez
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Cela copierait le fichier d'entrée dans un emplacement temporaire, puis appliquerait le awk
code sur le fichier temporaire lors de la redirection vers le nom de fichier d'origine.
Faire les opérations dans cet ordre (en exécutant awk
sur le fichier temporaire, pas sur le fichier d'origine) garantit que les métadonnées de fichier (autorisations et propriété) du fichier d'origine ne sont pas modifiées.
Essayez ceci.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- redirige la sortie vers un fichier temporaire.
- puis déplacez le contenu du fichier temporaire vers le fichier d'origine.