Excel и awk не согласны с итогами CSV - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть файл CSV, который я суммирую двумя способами: один с использованием Excel, а другой с использованием awk. Вот итоги моих первых 8 столбцов в Excel:

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 обрабатывает этот файл по-другому?

1 Ответ

3 голосов
/ 12 ноября 2010

Скорее всего, в кавычках указан номер в формате запятой.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

Обратите внимание, что второе приведенное выше регулярное выражение по-прежнему имеет проблему с трейлингом "в последнем поле и работает вообще, только если все поля последовательно заключены в кавычки - это только для иллюстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...