【问题标题】:Excel and awk disagree about CSV totalsExcel 和 awk 不同意 CSV 总计
【发布时间】:2010-11-12 05:24:35
【问题描述】:

我有一个 CSV 文件,我通过两种方式汇总:一种使用 Excel,另一种使用 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

这是我的awk 输出:

$ 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 的总数是正确的,那么为什么 awk 处理这个文件的方式不同?

【问题讨论】:

    标签: linux excel awk


    【解决方案1】:

    引号中可能包含逗号格式的数字。 Excel 会将该数字作为单个字段正确处理。您在 awk 中用于字段分隔的正则表达式不会 - 根据该正则表达式,数字内部的逗号是有效的分隔符。尝试处理可选的嵌套转义非常困难(而且大多是徒劳的),就像在 csv 中使用正则表达式一样。

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

    $ 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
    

    请注意,上面的第二个正则表达式仍然存在最后一个字段中尾随 " 的问题,并且只有在所有字段都被一致引用的情况下才有效 - 它仅用于说明目的。

    【讨论】:

    • 你似乎是对的。我想我会以不同的方式尝试我的解决方案,因为共识似乎是 awk 不适合 CSV。
    • 使用具有 csv 解析模块的语言,例如 Perl 和 Text::CSV
    • GNU Awk 4 实际上在处理复杂的 CSV 方面做得更好,但 Perl 或 Python 似乎仍然是更合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多