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

การทดสอบข้างต้นเสร็จสิ้นเมื่อ:

$ 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 จะมีข้อจำกัดด้านตัวเลขอยู่บ้าง - ฉันได้รับผลลัพธ์ที่แปลกกว่านั้นจากการเพ่งพิศ - บางทีการสนทนา ในเรื่องนี้ ดังนั้นจะช่วยคุณ

person rfernandes    schedule 18.02.2014