ファイル内で数値を乗算する

ファイル内で数値を乗算する

次のような数字を含む ASCII ファイルがあります。

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

このファイルをアップグレードするには、各値に「3」を掛けて次の値を取得します。

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

スクリプトを実行した後、これらの変更を同じASCIIファイルに自動的に更新して保存したい

標準の GNU ユーティリティを使用してこれを実現するにはどうすればよいでしょうか? 次のようにして値を更新できます。

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

答え1

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

更新:spongeプログラムを使用して入力ファイルに出力を書き込むことができます

sponge は標準入力を読み取り、指定されたファイルに書き出します。シェルのリダイレクトとは異なり、sponge は出力ファイルを開く前にすべての入力を吸収します。これにより、同じファイルから読み取り、同じファイルに書き込むパイプラインを制限できます。

答え2

この方法で新しい値をファイルに保存できます:

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

関連情報