我有一个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
以不同的方式处理这个文件?
答案 0 :(得分:3)
您的逗号格式编号可能包含在引号中。 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
请注意,上面的第二个正则表达式仍然存在“在最后一个字段中的尾随”的问题,并且只有在始终引用所有字段时才起作用 - 它仅用于说明目的。