С учетом data.awk ниже:
{
if (matched) {
for (i = 1; i <= NF; i++) {
$(i) = 30.0 - $(i)
}
}
print
}
/^C/ { matched = 1 }
BEGIN { CONVFMT = "%.20f" }
Вы получаете:
$ awk -f data.awk data.txt
TITLE
1.000000000000000
10.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 10.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 10.0000000000000000
U U
X X
C
29.79999999999999715783 29.79999999999999715783 29.79999999999999715783
29.70324000000000097543 29.93589999999999662350 29.84485000000000098908
29.89663000000000181444 29.66389000000000208956 29.75500999999999862666
У него, очевидно, есть проблема с точностью для ввода. Поэтому вы можете вызвать команду bc для фактических вычислений (она поддерживает произвольную точность):
{
if (matched) {
for (i = 1; i <= NF; i++) {
cmd = "echo 30.0 - " $(i) " | bc"
cmd | getline $(i)
close(cmd)
}
}
print
}
/^C/ { matched = 1 }
Результат:
TITLE
1.000000000000000
10.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 10.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 10.0000000000000000
U U
X X
C
29.7999999999999972 29.7999999999999972 29.7999999999999972
29.7032400000000010 29.9358999999999966 29.8448500000000010
29.8966300000000018 29.6638900000000021 29.755009999999999
Чтобы перезаписать data.txt с результатом , вам обычно нужно записать его в другой файл, а затем переименуйте его в исходный файл.
$ awk -f data.awk data.txt > data.txt.out
$ mv data.txt.out data.txt
Или используйте sponge в moreutils.
$ sudo apt-get install moreutils
$ awk -f data.awk data.txt | sponge data.txt