Я заметил странное поведение при заполнении массива в 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
не имеет арифметики с бесконечной (или неопределенной) точностью, чего я не думаю. 18 цифр — это предел для 64-битных целых чисел; 15 десятичных цифр - это предел для 64-битных чисел с плавающей запятой. Я предполагаю, что часть проблемы связана с этим. Избегайте преобразования строки из 21 цифры в число. - person Jonathan Leffler   schedule 18.02.2014161067106602122010074
добавление0
сделало161067106602122018816
. Разве это не должно снижать значение, а не увеличивать его? - person jaypal singh   schedule 18.02.2014