GNU awk
(häufig auf Linux-Systemen zu finden) kann seit Version 4.1.0 eine "awk
Quellbibliothek" mit -i
oder --include
auf der Kommandozeile. Eine der Quellbibliotheken, die mit GNU awk
vertrieben wird heißt inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Wie Sie sehen können, ergibt dies die Ausgabe von awk
Code ersetzt die Eingabedatei. Die Zeile mit der Aufschrift there
wird nicht beibehalten, da es nicht vom Programm ausgegeben wird.
Mit einem awk
script in einer Datei, würden Sie es wie verwenden
awk -i inplace -f script.awk datafile
Wenn die awk
Variable INPLACE_SUFFIX
auf eine Zeichenkette gesetzt ist, dann würde die Bibliothek eine Sicherungskopie der Originaldatei mit diesem als Dateinamensuffix erstellen.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Wenn Sie mehrere Eingabedateien haben, muss jede Datei einzeln an Ort und Stelle bearbeitet werden. Aber Sie können die direkte Bearbeitung für eine Datei (oder einen Satz von Dateien) deaktivieren, indem Sie inplace=0
verwenden auf der Befehlszeile vor dieser Datei:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Im obigen Befehl file3
nicht direkt bearbeitet werden.
Verwenden Sie für eine portablere "In-Place-Bearbeitung" einer einzelnen Datei
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Dies würde die Eingabedatei an einen temporären Speicherort kopieren und dann den awk
anwenden Code in der temporären Datei, während auf den ursprünglichen Dateinamen umgeleitet wird.
Führen Sie die Vorgänge in dieser Reihenfolge aus (Ausführen von awk
auf der temporären Datei, nicht auf der Originaldatei) stellt sicher, dass Datei-Metadaten (Berechtigungen und Besitz) der Originaldatei nicht geändert werden.
Probieren Sie es aus.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- leite die Ausgabe in eine temporäre Datei um.
- verschieben Sie dann den Inhalt der temporären Datei in die Originaldatei.