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
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
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.2014161067106602122010074
menambahkan0
menjadikannya161067106602122018816
. Bukankah seharusnya hal itu menurunkan nilainya alih-alih meningkatkannya? - person jaypal singh   schedule 18.02.2014