我必须用gawk处理一些巨大的文件。我的主要问题是我必须使用千位分隔符打印一些浮点数。例如:10000
在输出中应显示为10.000
和10000,01
为10.000,01
。
我(和谷歌)提出了这个功能,但这对于浮动来说是失败的:
function commas(n) {
gsub(/,/,"",n)
point = index(n,".") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)"."substr(n,point + 1)
}
sub(/-\./,"-",n)
return d n
}
但它失败了浮动。
现在我正在考虑将输入拆分为整数和&lt; 1部分,然后格式化整数再次胶合它们,但是没有更好的方法来做它?
声明:
答案 0 :(得分:2)
它失败了,因为你传递了欧洲类型的数字(1.000.000,25,一百万和四分之一)。如果您只是更改逗号和句点,则您提供的功能应该有效。我首先用1000000.25测试当前版本,看它是否适用于非欧洲数字。
可以使用"echo 1 | awk -f xx.gawk"
调用以下awk脚本,它将显示“正常”和欧洲版本。它输出:
123,456,789.1234
123.456.789,1234
显然,你只对函数感兴趣,现实世界的代码会使用输入流将值传递给函数,而不是固定的字符串。
function commas(n) {
gsub(/,/,"",n)
point = index(n,".") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)","substr(n,point + 1)
}
return n
}
function commaseuro(n) {
gsub(/\./,"",n)
point = index(n,",") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)"."substr(n,point + 1)
}
return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }
除了处理逗号和句号外,功能相同。我们将在以下描述中将它们称为分隔符和小数:
答案 1 :(得分:0)
使用Pax's answer:
阅读the "Conversion" section of the GNU awk manual,其中明确谈到了LOCALE
环境变量对数字类型字符串表示的影响。