สภาพ awk ของจริงและเท็จ


9

ฉันเจอว่าถ้าเราใช้awk 0 inputfileมันจะไม่พิมพ์สาเหตุใด ๆ0หมายความว่าผิดเงื่อนไข

หากเราใช้awk 1 inputfileมันจะพิมพ์ทุกอย่างตามที่เป็น1จริงสำหรับแต่ละบรรทัด awk ตีความ

ถ้าเราใช้awk any_string inputfileมันจะไม่พิมพ์อะไรเลยเพราะตัวแปร awk ทั้งหมดที่เริ่มต้นเป็นศูนย์จึงเป็นเท็จ

แต่ถ้าเราใช้awk any_integer inputfileมันจะกลายเป็นจริงและพิมพ์แต่ละบรรทัดของไฟล์ฉันจะรู้ได้อย่างไรว่าอะไรคือสาเหตุ?

ฉันไม่สามารถหานี้ได้รับการอธิบายในGNU awkคู่มือแม้ว่า


3
โดยany_integerฉันคิดว่าคุณหมายถึงตัวเลขตามตัวอักษรเช่น7, 89ฯลฯ หากเป็นเช่นนั้นเหตุผลก็คือจำนวนใด ๆ ที่ไม่ใช่เงื่อนไข0หมายถึงtrue
ซันเดพ

คำตอบ:


13

Trueสำหรับ awk เป็นทั้งสตริงที่ไม่ว่างเปล่าหรือตัวเลขที่ไม่ใช่ศูนย์ (ด้วยตัวเลขที่เป็นเลขจำนวนเต็มฐานสิบหรือทศนิยมและมีการใช้งาน awk บางส่วนเป็นเลขฐานสิบหกหรือฐานแปดได้เช่นกัน) สิ่งที่อยู่ในเครื่องหมายคำพูดคู่คือสตริงตัวเลขตัวอักษรที่ไม่ได้ยกมาเป็นตัวเลข แต่สำหรับสิ่งอื่นมีกฎที่ซับซ้อนในการพิจารณาว่ามีบางสิ่งที่จะถือว่าเป็นสตริงหรือตัวเลข ลิขสิทธิ์ GNU awkคู่มือมีทั้งบทที่

จริง:

  • awk '1' (หมายเลขที่ไม่ใช่ศูนย์)
  • awk '1e8' (หมายเลขที่ไม่ใช่ศูนย์)
  • awk '-0.01' (หมายเลขที่ไม่ใช่ศูนย์)
  • awk '"foo"' (สตริงที่ไม่ว่างเปล่า)
  • awk '"0"' (สตริงที่ไม่ว่างเปล่า)
  • awk '0 ""' (การต่อข้อมูลทำให้สตริงที่นี่ไม่ว่าง)
  • echo 0 | awk '$1 ""' (เหมือนกันกับฟิลด์ $ n)
  • awk 'substr("000", 1, 1)'(ผลลัพธ์ของsubstr()เป็นสตริงเสมอ)
  • echo '0foo' | awk '$0' ($ 0 เป็นสตริงที่ไม่ใช่ตัวเลขดังนั้นถือเป็นสตริง (ไม่ว่าง))

เท็จ:

  • awk '0' (0 หมายเลข)
  • awk '""' (สตริงว่าง)
  • echo 0000e123 | awk '$1' ($ 1 ถือว่าเป็นตัวเลขหากเป็นสตริงตัวเลขซึ่งอยู่ที่นี่และเป็น 0)
  • echo ' 0 ' | awk '$0' (ช่องว่างนำหน้าและต่อท้ายจะถูกละเว้นเพื่อพิจารณาว่าสตริงเป็นตัวเลขหรือไม่)
  • awk '" 2foo" - 2' (สตริงที่เกี่ยวข้องในนิพจน์เลขคณิตจะถูกแปลงเป็นตัวเลขโดยไม่สนใจตัวเลข)
  • awk 'unset_or_empty_variable' (สตริงว่าง)
  • awk '"non-numerical-string" + 0'

YMMV:

  • awk '1e-500' (บางคนจะบ่นบางคนจะถือว่าเป็น 0)
  • awk '"0x1" + 0'(ไม่ทั้งหมดการใช้งาน awk สนับสนุน hexadecimals ในผู้ที่"0x1"จะถูกแปลงเป็น1ในคนอื่น ๆ ไป0. รุ่นที่บางส่วนของสเป POSIX การใช้งานที่จำเป็นโดยไม่ได้ตั้งใจที่จะสนับสนุนจำนวนฐานสิบหกว่ามีและมันก็ถูกยกเลิกในภายหลัง. ยังgawkไม่รับรู้จำนวนฐานสิบหกที่ว่าเมื่อPOSIXLY_CORRECTอยู่ใน สิ่งแวดล้อม)
  • awk '010 - 8' (เหมือนกัน (ไม่มากเหมือนกับที่ 010 เป็นตัวอักษรตรงข้ามกับการแปลงจากสตริง) สำหรับ octals
  • awk '0x1 - 1'(ในawkการใช้งานที่ไม่รองรับเลขฐานสิบหก0x1คือการต่อข้อมูล0และx1ตัวแปรที่ให้ผลการ"0"แปลงเป็นตัวเลข (0) หากคุณลบ1คุณจะได้รับ-1ซึ่งไม่ใช่จำนวนศูนย์)

หมายความว่าถ้าคุณต้องการตรวจสอบว่าสตริงไม่ว่างคุณไม่ควรทำ:

awk '$ 1 {พิมพ์ $ 1, "ไม่ว่างเปล่า"}'

แต่

awk '$1 != "" {print $1, "is not empty"}'

มิฉะนั้นจะไม่พูด0หรือ-0000E+00001234ไม่ว่างเปล่า


คำตอบที่น่าประทับใจและรายละเอียด! แต่คำถามหนึ่ง: ในตัวอย่างสุดท้ายที่คุณให้ฉันลองใช้ไวยากรณ์และคำถามแรกทำงานได้โดยที่ข้าม $ 1 ซึ่งว่างเปล่าและพิมพ์บรรทัดเหล่านั้นด้วย $ 1 ที่ไม่ว่างเปล่าเพราะถ้า $ 1 เป็นสตริงว่างมันจะเป็น เป็นเท็จและไม่พิมพ์ผลลัพธ์ใช่หรือไม่
sylye
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.