Умножение чисел на месте в файле

Умножение чисел на месте в файле

У меня есть файл 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программу для записи выходных данных во входной ФАЙЛ

губка считывает стандартный ввод и записывает его в указанный файл. В отличие от перенаправления оболочки, губка впитывает весь свой ввод перед открытием выходного файла. Это позволяет сузить конвейеры, которые считывают и записывают в один и тот же файл.

решение2

Таким образом вы можете сохранить новые значения в файл:

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

Связанный контент