GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie ändere ich eine Datei direkt mit awk? (wie bei sed -i)

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.

Linux
  1. So ändern Sie das memory_limit in der .htaccess-Datei

  2. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  3. Wie erreicht man Portabilität mit Sed -i (In-Place-Editing)?

  4. So sortieren Sie eine Datei an Ort und Stelle

  5. Wie ändere ich die Kodierung, die mein SFTP-Server verwendet?

So ändern Sie den GNOME-Hintergrund automatisch in Intervallen mit BASH

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

So löschen Sie leere Zeilen in Dateien mit Grep, Sed und Awk

So ändern Sie Dateiberechtigungen mit FileZilla

Gewusst wie:Eine Einführung in die Verwendung von Git

Unix Sed Tutorial:So schreiben Sie mit Sed in eine Datei