ฉันสังเกตเห็นพฤติกรรมแปลก ๆ ขณะเติมอาร์เรย์ใน 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
one-liner ผลลัพธ์ดูเหมือนจะเป็นสิ่งที่ฉันคาดหวัง สิ่งที่ฉันอยากรู้คือทำไมมันถึงทำให้คีย์เสียหาย?
การทดสอบข้างต้นเสร็จสิ้นเมื่อ:
$ 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