Perilaku AWK yang aneh saat memaksa ekspresi menjadi angka (menambahkan 0)

Saya melihat perilaku aneh saat mengisi array di awk. Indeks dan nilai keduanya berupa angka, jadi penambahan 0 seharusnya tidak berdampak. Untuk lebih memahaminya, mari kita ambil contoh berikut:

Berikut adalah file yang ingin saya gunakan untuk demo ini:

$ 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

Yang ingin saya lakukan adalah membuat indeks dari $1 dan menetapkan nilainya dari $2. Saya akan mengekstraksi potongan nilai dari $1 dan $2 menggunakan fungsi substr.

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

Sekarang, idealnya keluaran yang seharusnya adalah sebagai berikut (abaikan fakta bahwa array asosiatif dapat menghasilkan keluaran secara acak):

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

Tapi, output yang saya dapatkan adalah sebagai berikut:

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

Tangkapan Layar

Jika saya menghapus +0 dari atas awk satu baris, hasilnya sepertinya seperti yang saya harapkan. Yang ingin saya ketahui adalah mengapa kuncinya rusak?

Pengujian di atas dilakukan pada:

$ awk -version
awk version 20070501

awk
person jaypal singh    schedule 18.02.2014    source sumber
comment
angka 21 digit; itu melampaui batas kecuali awk memiliki aritmatika dengan presisi tak terbatas (atau, presisi tak terbatas), yang menurut saya tidak memilikinya. 18 digit adalah batas bilangan bulat 64-bit; 15 digit desimal adalah batas angka floating point 64-bit. Saya kira beberapa masalah terkait dengan hal ini. Hindari mengubah string 21 digit menjadi angka.   -  person Jonathan Leffler    schedule 18.02.2014
comment
Hmm, terima kasih @JonathanLeffler, tapi untuk 161067106602122010074 menambahkan 0 menjadikannya 161067106602122018816. Bukankah seharusnya hal itu menurunkan nilainya alih-alih meningkatkannya?   -  person jaypal singh    schedule 18.02.2014
comment
Saat Anda mulai mencetak angka di luar presisi, segala sesuatu mungkin terjadi. Konversi ke angka itulah yang menyebabkan perubahan.   -  person Jonathan Leffler    schedule 18.02.2014


Jawaban (1)


Tampaknya AWK memiliki beberapa batasan numerik - saya mendapatkan hasil yang lebih aneh lagi di gawk - mungkin diskusi di sini JADI akan membantu Anda.

person rfernandes    schedule 18.02.2014