Ich habe eine ASCII-Datei mit folgenden Zahlen:
1 2 3
5 6 9
7 8 9
. . .
. . .
. . .
. . .
. . . etc
Ich möchte diese Datei aktualisieren, indem ich jeden Wert mit „3“ multipliziere, um Folgendes zu erhalten:
3 6 9
15 18 27
21 24 27
. . .
. . .
. . .
. . .
. . . etc
Ich möchte, dass diese Änderungen nach dem Ausführen des Skripts aktualisiert und automatisch in derselben ASCII-Datei gespeichert werden
Wie kann ich dies mit Standard-GNU-Dienstprogrammen erreichen? Ich kann die Werte folgendermaßen aktualisieren:
while IFS=",$IFS" read d1 d2 d3; do
echo $(( $d1*3 )) $(( $d2*3 )) $(( $d3*3 ))
done < file.txt #file.txt is the previous ASCII file
Antwort1
verwenden Sie awk:
$awk -F" " '{$1*=3;$2*=3;$3*=3;print}' FILE | sponge FILE
$cat FILE
3 6 9
15 18 27
21 24 27
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
Update: Sie können sponge
das Programm verwenden, um die Ausgabe in die Eingabedatei zu schreiben
Sponge liest die Standardeingabe und schreibt sie in die angegebene Datei. Anders als bei einer Shell-Umleitung nimmt Sponge alle Eingaben auf, bevor die Ausgabedatei geöffnet wird. Dadurch können Pipelines eingeschränkt werden, die aus derselben Datei lesen und in dieselbe Datei schreiben.
Antwort2
Auf diese Weise können Sie neue Werte in einer Datei speichern:
awk -F" " '{$1*=3;$2*=3;$3*=3;print}' FILE | tee FILE