我试图使用gawk找到一列数据的最大值:
gawk 'BEGIN{max=0} {if($1>0+max) max=$1} END {print max}' dataset.dat其中dataset.dat看起来是这样的:
2.0e-318
命令的输出是
2.0e-318
明显小于2。
我的错误在哪里?
有趣的是,如果您交换输入文件的行,则输出将变为
2.0
我的gawk版本是GNU Awk 4.2.1,API: 2.0 (GNU MPFR 4.0.2,GNU MP 6.1.2)。
发布于 2020-01-27 16:09:20
0+需要以每个$1作为前缀,以强制进行数字转换。max不需要0+ --它存储时已经转换为数字。
Paul--) AWK='
> BEGIN { max = 0; }
> 0+$1 > max { max = 0 + $1; }
> END { print max; }
> '
Paul--) awk "${AWK}" <<[][]
> 2.0
> 2.0e-318
> [][]
2
Paul--) awk "${AWK}" <<[][]
> 2.0e-318
> 2.0
> [][]
2发布于 2020-01-27 21:39:48
在awk中处理这么小的数字(2e-318)有几个问题。
1e-308的值。awk ( CNVFMT和OFMT)的默认转换格式设置为"%.6g"。超过6个重要数字的数字将被截断。想要更多有意义的数字,就去问他们。就像15位的%.15g (不要要求超过17位的53位尾数,它可能会说谎)。max的第一个值设置为第一个输入。如果输入有负最大值,则将最大值设置为0将失败。如果您使用的是GNU awk,并且它是以任意精度编译的,您可以使用:
$ printf '%s\n' 2e-318 2e-317 2e-307 2e-308 2e-319 |
awk -M -v PREC=100 'BEGIN{OFMT="%.15g"};
{val=0+$1};
NR==1{max=val};
{print($1,val,max)};
val>max{max=val}
END{print max}'
2e-318 2e-318 2e-318
2e-317 2e-317 2e-318
2e-307 2e-307 2e-317
2e-308 2e-308 2e-307
2e-319 2e-319 2e-307
2e-307 或者简化为用例:
awk -M -v PREC=100 '
BEGIN{OFMT="%.15g"}; # allow more than 6 figures
{val=0+$1}; # convert input to a (float) number.
NR==1{max=val}; # On the first line, set the max value.
val>max{max=val} # On every entry keep track of the max.
END{print max} # At the end, print the max.
' file # file with input (one per line).https://unix.stackexchange.com/questions/564397
复制相似问题