Multiplicar números in situ en un archivo

Multiplicar números in situ en un archivo

Tengo un archivo ASCII que contiene los siguientes números:

1 2 3
5 6 9
7 8 9 
. . . 
. . . 
. . . 
. . . 
. . .  etc

Quiero actualizar este archivo multiplicando cada valor por "3" para obtener:

3 6 9
15 18 27
21 24 27 
. . . 
. . . 
. . . 
. . . 
. . .  etc

Quiero que estos cambios se actualicen y guarden automáticamente en el mismo archivo ASCII después de ejecutar el script.

¿Cómo puedo lograr esto usando las utilidades estándar de GNU? Puedo actualizar los valores haciendo:

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

Respuesta1

utilizar 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

actualización: puede usar spongeel programa para escribir la salida en el ARCHIVO de entrada

esponja lee la entrada estándar y la escribe en el archivo especificado. A diferencia de una redirección de shell, la esponja absorbe todas sus entradas antes de abrir el archivo de salida. Esto permite restringir las canalizaciones que leen y escriben en el mismo archivo.

Respuesta2

De esta manera puede guardar nuevos valores en el archivo:

awk -F" "  '{$1*=3;$2*=3;$3*=3;print}' FILE | tee FILE

información relacionada