Ich bin auf eine Frage (zu SO selbst) gestoßen, bei der OP die Operation bearbeiten und in Input_file (s) selbst speichern muss.
Ich weiß, dass wir für eine einzelne Eingabedatei Folgendes tun können:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Nehmen wir nun an, wir müssen Änderungen im gleichen Dateiformat vornehmen (hier wird .txt angenommen).
Was ich für dieses Problem versucht / gedacht habe: Sein Ansatz besteht darin, eine for-Schleife von TXT-Dateien zuawk
durchlaufen,und das Aufrufen von Singleist ein schmerzhafter und NICHT empfohlener Prozess, da unnötige CPU-Zyklen verschwendet werden und für mehr Dateien mehr langsam.
Was könnte hier also möglicherweise getan werden, um eine Inplace-Bearbeitung für mehrere Dateien mit einer NON GNU durchzuführen, awk
die die Inplace-Option nicht unterstützt? Ich habe auch diesen Thread durchgearbeitet. Speichern Sie Änderungen an Ort und Stelle mit awk, aber es gibt nicht viel für NON GNU awk vice und das Ändern mehrerer Dateien an awk
sich, da ein Nicht-GNU awk keine inplace
Option dazu hat.
HINWEIS: Warum ich einbash
Taghinzufüge,da ich in meinem Antwortteil Bash-Befehle verwendet habe, um temporäre Dateien in ihre tatsächlichen Input_file-Namen umzubenennen, um sie hinzuzufügen.
BEARBEITEN: Gemäß dem Kommentar von Ed Sir, der hier ein Beispiel für Beispiele hinzufügt, obwohl der Zweck des Codes dieses Threads auch für die allgemeine Bearbeitung an Ort und Stelle verwendet werden könnte.
Beispiel-Eingabedatei (en):
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Beispiel für die erwartete Leistung:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
(möglicherweise in einer Subshell) oder einer {...}
geschlossenen Gruppe und schreiben Sie die Ergebnisse in die gewünschte Ausgabedatei (entweder für jede Eingabedatei). oder eine kombinierte Datei für alle Eingabedateien). Dann leiten Sie einfach die Ausgabe der Unterschale oder der in Klammern eingeschlossenen Gruppe in die aktuelle Datei um, in die geschrieben wird? Das einfache Einfügen einer Zeichenfolge von Eingabedateien nach dem awk
Befehl würde alle Dateien (oder ähnliches) nacheinander verarbeiten.
awk {..} file1 .. fileX
Schreiben der geänderten Datei als z. B. temp01
und in Ihrer nächsten Iteration während der Verarbeitung der nächsten Datei verwenden Sie a mv -f tmp01 input01
, um die Eingabedatei mit den geänderten Daten zu überschreiben. oder (2) schreiben Sie einfach ein neues Verzeichnis von ./tmp/tmp01 ... ./tmp/tmp0X
während der Ausführung des awk
Skripts und folgen Sie mit einer Schleife über die Dateien im ./tmp
Verzeichnis und z. B. mv -f "$i" "input_${i##*[^0-9]}"
(oder welche Erweiterung Sie benötigen, um die alten Eingabedateien zu ersetzen.
awk
die vollständige Code-Vervollständigung tun. Die 2. Option ist fast die gleiche, die ich in meinem Vorschlag verwende Seien Sie dankbar, wenn Sie Ihre Gedanken über diese Lösung wissen lassen könnten, Sir.