是否可以在 (g)awk 脚本中处理 long int 或大整数?
Is it possible to handle long int or big integers in (g)awk script?
由于 awk 以双精度处理所有数字,长整数(如 long int 类型,或更常见:long)将达到 53 位(或 16.5 位左右的数字)。这意味着如果程序从 x86_64 体系结构中得到一个 long int,其中 long int 是 64 位,我们就会遇到麻烦。有没有 awk 脚本来处理这种情况?
在启动期间使用 -M 或 -bignum 并不是一个真正的选项,因为脚本对于 awk 脚本来说有点太大,而且我不想更改一般行为。打印使用,
printf("%d\n",1234567890123456789)
不是真正的选择。即使将打印所有数字,精度仍然只精确到最后一个“7”(1234567890123456768).
有人有不涉及内联 python 或 perl 的建议吗?
BR
帕特里克
PS
我经常看到要处理 "very large integers" 或 "long integers" 的问题,其中 "long" 表示非常大。此外,这些问题是指 bash 中的内联 awk,其中 -M 不是问题。但是,这个问题具体是指在脚本模式下处理long int类型。
编辑
只是为了澄清更多。标记为重复的问题没有回答我的问题,因为我提到我想在脚本中解决这个问题,而不改变 awk 的行为。添加 -M 标志将改变所有其他 100,000 行 awk 的行为,我不想这样做。
换句话说,我希望 awk 的 99,999 行表现得好像没有设置标志 -M 并且有 1 行处理长整数。我很清楚这在 awk 中可能是不可能的,但我想我会在放弃之前尝试这里。
既然你提到了 --bignum
选项,我假设你正在使用 gawk。
我不认为 gawk 提供了一种将 MP 库用于数千个特定程序行的方法。但是,作为一种解决方法,您可以使用任意精度计算器 bc
作为协同处理。
换句话说,而不是:
gawk -v var=123456789012345676890 '
BEGIN {
var2 = var + 1
print var " + 1 = " var2
}
'
... 错误地显示:
123456789012345676890 + 1 = 123456789012345683968
您可以使用:
gawk -v var=123456789012345676890 '
BEGIN {
print var " + 1" |& "bc"
"bc" |& getline var2
print var " + 1 = " var2
}
'
... 将正确显示:
123456789012345676890 + 1 = 123456789012345676891
由于 awk 以双精度处理所有数字,长整数(如 long int 类型,或更常见:long)将达到 53 位(或 16.5 位左右的数字)。这意味着如果程序从 x86_64 体系结构中得到一个 long int,其中 long int 是 64 位,我们就会遇到麻烦。有没有 awk 脚本来处理这种情况?
在启动期间使用 -M 或 -bignum 并不是一个真正的选项,因为脚本对于 awk 脚本来说有点太大,而且我不想更改一般行为。打印使用,
printf("%d\n",1234567890123456789)
不是真正的选择。即使将打印所有数字,精度仍然只精确到最后一个“7”(1234567890123456768).
有人有不涉及内联 python 或 perl 的建议吗?
BR 帕特里克
PS
我经常看到要处理 "very large integers" 或 "long integers" 的问题,其中 "long" 表示非常大。此外,这些问题是指 bash 中的内联 awk,其中 -M 不是问题。但是,这个问题具体是指在脚本模式下处理long int类型。
编辑
只是为了澄清更多。标记为重复的问题没有回答我的问题,因为我提到我想在脚本中解决这个问题,而不改变 awk 的行为。添加 -M 标志将改变所有其他 100,000 行 awk 的行为,我不想这样做。
换句话说,我希望 awk 的 99,999 行表现得好像没有设置标志 -M 并且有 1 行处理长整数。我很清楚这在 awk 中可能是不可能的,但我想我会在放弃之前尝试这里。
既然你提到了 --bignum
选项,我假设你正在使用 gawk。
我不认为 gawk 提供了一种将 MP 库用于数千个特定程序行的方法。但是,作为一种解决方法,您可以使用任意精度计算器 bc
作为协同处理。
换句话说,而不是:
gawk -v var=123456789012345676890 '
BEGIN {
var2 = var + 1
print var " + 1 = " var2
}
'
... 错误地显示:
123456789012345676890 + 1 = 123456789012345683968
您可以使用:
gawk -v var=123456789012345676890 '
BEGIN {
print var " + 1" |& "bc"
"bc" |& getline var2
print var " + 1 = " var2
}
'
... 将正确显示:
123456789012345676890 + 1 = 123456789012345676891