代码之家  ›  专栏  ›  技术社区  ›  Jason Swett

Excel和awk不同意CSV总计

  •  3
  • Jason Swett  · 技术社区  · 14 年前

    awk . 以下是我在Excel中前8列的总和:

    1) 2640502474.00
    2) 1272849386284.00
    3) 36785.00
    4) 
    5) 107.00
    6) 239259.00
    7) 0.00
    8) 7418570893330.00
    

    这是我的 输出:

    $ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$1} END {printf("%01.2f\n", s)}'
    2640502474.00
    $ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$2} END {printf("%01.2f\n", s)}'
    1272849386284.00
    $ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$8} END {printf("%01.2f\n", s)}'
    7411306364347.00
    

    注意1和2是如何精确匹配的,但是8的值却相差数百万。我假设Excel的总数是正确的,那么为什么 以不同方式处理此文件?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Alex Stoddard    14 年前

    引号中可能包含逗号格式的数字。Excel将把这个数字作为一个字段处理。awk中用于字段分隔的正则表达式不会-根据该正则表达式,数字内部的逗号是有效的分隔符。尝试处理可选的嵌套转义非常困难(而且基本上是徒劳无功的),就像csv中使用regex可以实现的那样。

    比较以下内容以了解可能发生的情况:

    $ echo '"1","10","15","1,000","14"' | awk -F "\"*,\"*" '{print $4}'
    1
    $ echo '"1","10","15","1,000","14"' | awk -F "\",\"" '{print $4}'
    1,000
    

    请注意,上面的第二个regex在最后一个字段中仍然有一个尾随“的问题,并且只有在所有字段都被一致引用的情况下才起作用-它只是为了说明的目的。