如何使用列操作的AWK printf保持算术运算的精度

如何使用列操作的AWK printf保持算术运算的精度,awk,printf,Awk,Printf,我正在尝试使用awk对列进行简单的划分。然而,它总是提供一些四舍五入到一些数字的结果。我如何避免这种情况 cat input 0.17292020834074046 0.17199272520432343 0.17019054988940305 0.16983492954097731 0.22565582053882802 0.22452108440371940 0.22246477069620715 0.22201995331072724 我试着将$1/$3和$2/$4

我正在尝试使用awk对列进行简单的划分。然而,它总是提供一些四舍五入到一些数字的结果。我如何避免这种情况

   cat input
    0.17292020834074046 0.17199272520432343 0.17019054988940305 0.16983492954097731
    0.22565582053882802 0.22452108440371940 0.22246477069620715 0.22201995331072724
我试着将$1/$3和$2/$4除以

这两种方法都给出了一些截断的结果

1.01604 1.01271
1.01434 1.01127
是否可以打印除法的完整结果而不进行任何截断,如bc计算器所提供的那样

所需输出:

1.01603883678095673602 1.01270525250122645076
1.01434406819845869150 1.01126534374814371224

你能试试下面的吗

awk '{printf "%.20f\t%.20f\n", $1/$3,$2/$4 }'  Input_file

你能试试下面的吗

awk '{printf "%.20f\t%.20f\n", $1/$3,$2/$4 }'  Input_file

使用标准awk,您可能会得到不准确的结果。如果您有可用的GNU awk,您可以通过-bignum标志和适当地设置mt和PREC来实现这一点:

awk -M '{ print $1/$3, $2/$4 }' OFMT='%.20f' PREC=100 input
输出:

1.01603883678095673602 1.01270525250122645077 1.01434406819845869150 1.01126534374814371224
可能相关。

使用标准awk,您可能会得到不准确的结果。如果您有可用的GNU awk,您可以通过-bignum标志和适当地设置mt和PREC来实现这一点:

awk -M '{ print $1/$3, $2/$4 }' OFMT='%.20f' PREC=100 input
输出:

1.01603883678095673602 1.01270525250122645077 1.01434406819845869150 1.01126534374814371224 可能相关。

如果bc是一个选项,您可以使用GNU sed执行以下操作:

sed -E 's:([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+):echo "scale=20; \1 / \3" | bc -l\necho "scale=20; \2 / \4" | bc -l:e; s/\n/ /'
使用更便携的sed:

{ 
  echo scale=20
  sed -E 's:([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+):\1 / \3\
\2 / \4:' input; 
}     | 
bc -l |
paste -d' ' - -
两种情况下的输出:

1.01603883678095673602 1.01270525250122645076 1.01434406819845869150 1.01126534374814371224 如果bc是一个选项,您可以使用GNU sed执行以下操作:

sed -E 's:([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+):echo "scale=20; \1 / \3" | bc -l\necho "scale=20; \2 / \4" | bc -l:e; s/\n/ /'
使用更便携的sed:

{ 
  echo scale=20
  sed -E 's:([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+):\1 / \3\
\2 / \4:' input; 
}     | 
bc -l |
paste -d' ' - -
两种情况下的输出:

1.01603883678095673602 1.01270525250122645076 1.01434406819845869150 1.01126534374814371224
这是正确的,但对于多列,我是否必须为我要打印的每列执行%f,或者如果我想对所有要打印的列都具有相同的精度,是否有任何全局/短选项。@Boogeyman,您可以使用循环在所有字段中进行迭代,并在其中调用此选项?因为没有显示样本,所以我无法对其进行测试。它是正确的,但对于多列,我是否必须对要打印的每列执行%f,或者如果我希望对所有要打印的列都具有相同的精度,是否有任何全局/短选项。@Boogeyman,您可以使用循环在所有字段中进行迭代,并在其中调用此选项?因为没有样品,所以我无法测试。