Я предполагаю, что проблема, которую вы пытаетесь решить, заключается в том, что вы ожидаете большей точности от этого вычисления?
$ cat tst.awk
BEGIN { print t(2.7347488229 * 180 / 3.141592653589) }
function t(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}
$ awk -f tst.awk
156.69
Если это так, то обратите внимание на эффект установки CONVFMT на более высокийзначение, превышающее точность, которую вы хотите получить после усечения:
$ cat tst.awk
BEGIN { print t(2.7347488229 * 180 / 3.141592653589) }
function t(n, s) {
CONVFMT="%0.17f"
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}
$ awk -f tst.awk
156.689565
Это работает, потому что эффект substr () заключается в преобразовании числа в строку, и в этот момент применяется значение CONVFMTсм. https://www.gnu.org/software/gawk/manual/gawk.html#Strings-And-Numbers.
Вы можете установить CONVFMT в разделе BEGIN, но я установил его рядом с тем местом, где требуется его эффект, так что вы можете настроить, чтобы не влиять на остальную часть сценария, если хотите:
$ cat tst.awk
BEGIN { print t(2.7347488229 * 180 / 3.141592653589) }
function t(n, s, origConvfmt) {
origConvfmt=CONVFMT
CONVFMT="%0.17f"
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
CONVFMT=origConvfmt
}
$ awk -f tst.awk
156.689565
Наконец - чтобы избавиться от избыточности, попробуйте переписать ваш скрипт следующим образом:
$ cat tst.awk
BEGIN { CONVFMT="%0.17f" }
!NF { flag=0 }
$NF == "Format" { flag=($NF-1 == "F" ? 1 : 0) }
$1 !~ /^[0-9]+$/ { next }
$1 == 11 { prt(180,3.141592653589); next }
$1 == 15 { prt(100,1); next }
$1 == 20 { prt(10,1); next }
$1 != 26 { prt(1,1) }
function prt(mult, div) {
print trunc($5 * mult / div) ORS trunc($6 * mult / div)
}
function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}
РЕДАКТИРОВАТЬ 1 Учитывая ваше обновленное требование не печатать содержимое 2-готаблица:
$ cat tst.awk
BEGIN { CONVFMT="%0.17f" }
/D Format/ { exit }
$1 !~ /^[0-9]+$/ { next }
$1 == 11 { prt(180,3.141592653589); next }
$1 == 15 { prt(100,1); next }
$1 == 20 { prt(10,1); next }
$1 != 26 { prt(1,1) }
function prt(mult, div) {
print trunc($5 * mult / div) ORS trunc($6 * mult / div)
}
function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}
.
$ awk -f tst.awk file
43.685030
0.106608
0.080182
0.000675
156.689565
0.657108
21.935614
0.176999
83.864830
0.115873
22.502499
0.047924
3.936308
0.005290
7.491860
0.009210