代码之家  ›  专栏  ›  技术社区  ›  Zsolt Botykai

用Gawk打印千个分离的浮球

  •  0
  • Zsolt Botykai  · 技术社区  · 15 年前

    我必须用gawk处理一些大文件。我的主要问题是我必须用千个分隔符打印一些浮点数。例如。: 10000 应显示为 10.000 10000,01 作为 10.000,01 在输出中。

    我(和Google)想出了这个函数,但对于float来说失败了:

    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
    }
    

    但是它失败了。

    现在,我正在考虑将输入拆分为一个整数和一个<1部分,然后在格式化整数后再次将它们粘在一起,但是否有更好的方法可以做到这一点?

    免责声明:

    • 我不是程序员
    • 我知道,通过一些外壳环境。变量千位分隔符可以设置,但它必须在具有不同语言和/或区域设置的不同环境中工作。
    • 英语是我的第二语言,如果我用错了,对不起
    2 回复  |  直到 10 年前
        1
  •  2
  •   paxdiablo    15 年前

    它使用float失败,因为您传递的是欧洲类型的数字(1.000.000,25代表一百万和四分之一)。如果您只是更改逗号和句点,那么您提供的函数应该可以工作。我先用1000000.25测试当前版本,看看它是否适用于非欧洲数字。

    可以使用调用以下awk脚本 "echo 1 | awk -f xx.gawk" 它将向您展示“正常”和欧洲版本的实际应用。它输出:

    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删除了所有现有的分隔符,因为我们将把它们放回去。
    • 点找到小数点的位置,因为这是我们的起点。
    • 如果没有小数,if语句将从末尾开始。
    • 当剩下三个以上的字符时,我们循环。
    • 在循环中,我们调整插入分隔符的位置,然后插入分隔符。
    • 循环完成后,我们返回调整后的值。
        2
  •  0
  •   Community Dan Abramov    7 年前

    一起去 Pax's answer :

    the "Conversion" section of the GNU awk manual 它明确地谈到了 LOCALE 数值类型的字符串表示形式上的环境变量。