Странное поведение AWK при принудительном преобразовании выражения в число (добавление 0)

Я заметил странное поведение при заполнении массива в awk. И индексы, и значение были числами, поэтому добавление 0 не должно было повлиять. Для понимания возьмем следующий пример:

Вот файл, который я хочу использовать для этой демонстрации:

$ cat file
2.60E5-2670161065730303122012098 Invnum987678
2.60E5-2670161065846403042011098 Invnum987912
2.60E5-2670161065916903012012075 Invnum987654
2.60E5-2670161066813503042011075 Invnum987322
2.60E5-2670161066835008092012075 Invnum987323
2.60E5-2670161067040701122012075 Invnum987324
2.60E5-2670161067106602122010074 Invnum987325

Я хотел бы создать индекс из $1 и присвоить ему значение из $2. Я буду извлекать части стоимости из $1 и $2, используя функцию substr.

$ awk '{p=substr($1,12)+0; A[p]=substr($2,7)+0;next}END{for(x in A) print x,A[x]}’ file

Теперь в идеале вывод должен был быть следующим (игнорируйте тот факт, что ассоциативные массивы могут выводить случайным образом):

161065730303122012098 987678
161065846403042011098 987912
161065916903012012075 987654
161066813503042011075 987322
161066835008092012075 987323
161067040701122012075 987324
161067106602122010074 987325

Но вывод, который я получил, был следующим:

161066835008092012544 987323
161065846403042017280 987912
161067040701122019328 987324
161067106602122018816 987325
161066813503041994752 987322
161065916903012007936 987654
161065730303122014208 987678

Скриншот

Если я удалю +0 сверху awk однострочника, результат будет таким, как я ожидаю. Что я хотел бы знать, так это то, почему он испортил ключи?

Вышеупомянутый тест был проведен на:

$ awk -version
awk version 20070501

awk
person jaypal singh    schedule 18.02.2014    source источник
comment
21-значные номера; это раздвигает границы, если только awk не имеет арифметики с бесконечной (или неопределенной) точностью, чего я не думаю. 18 цифр — это предел для 64-битных целых чисел; 15 десятичных цифр - это предел для 64-битных чисел с плавающей запятой. Я предполагаю, что часть проблемы связана с этим. Избегайте преобразования строки из 21 цифры в число.   -  person Jonathan Leffler    schedule 18.02.2014
comment
Хм, спасибо @JonathanLeffler, но за 161067106602122010074 добавление 0 сделало 161067106602122018816. Разве это не должно снижать значение, а не увеличивать его?   -  person jaypal singh    schedule 18.02.2014
comment
Когда вы начинаете печатать числа за пределами точности, все возможно. Это было преобразование в число, которое вызвало изменение.   -  person Jonathan Leffler    schedule 18.02.2014


Ответы (1)


Похоже, что AWK имеет некоторые числовые ограничения - я получаю еще более странные результаты на gawk - возможно, обсуждение в этом SO поможет вам.

person rfernandes    schedule 18.02.2014