使用GAWK打印千张分离的浮子

时间:2009-04-15 10:40:11

标签: formatting floating-point separator gawk

我必须用gawk处理一些巨大的文件。我的主要问题是我必须使用千位分隔符打印一些浮点数。例如:10000在输出中应显示为10.00010000,0110.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部分,然后格式化整数再次胶合它们,但是没有更好的方法来做它?

声明:

  • 我不是程序员
  • 我知道通过一些SHELL环境。变量可以设置千位分隔符,但它必须在具有不同lang和/或区域设置的不同环境中工作。
  • 英语是我的第二语言,对不起,如果我使用不正确

2 个答案:

答案 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") }

除了处理逗号和句号外,功能相同。我们将在以下描述中将它们称为分隔符和小数:

  • gsub删除所有现有的分隔符,因为我们将它们放回去。
  • point找到小数的位置,因为那是我们的起点。
  • 如果没有小数,则if语句从最后开始。
  • 我们循环,而剩下三个以上的字符。
  • 在循环内部,我们调整插入分隔符的位置,然后插入它。
  • 循环结束后,我们返回调整后的值。

答案 1 :(得分:0)

使用Pax's answer

阅读the "Conversion" section of the GNU awk manual,其中明确谈到了LOCALE环境变量对数字类型字符串表示的影响。