điều kiện awk đúng và sai


9

Tôi đã đi qua rằng nếu chúng ta sử dụng awk 0 inputfile, nó sẽ không in bất cứ điều gì 0có nghĩa là sai của điều kiện.

Nếu chúng ta sử dụng awk 1 inputfile, nó sẽ in mọi thứ 1có nghĩa là đúng với từng dòng diễn giải awk.

Nếu chúng ta sử dụng awk any_string inputfile, nó sẽ không in bất cứ thứ gì vì tất cả các biến awk được khởi tạo là 0 do đó sai.

Nhưng nếu chúng ta sử dụng awk any_integer inputfile, nó sẽ trở thành sự thật và in từng dòng của tệp, tôi có thể biết lý do là gì không?

Tôi không thể tìm thấy điều này đã được giải thích trong hướng dẫn GNUawk .


3
bởi any_integertôi cho rằng bạn có nghĩa là số theo nghĩa đen như 7, 89vv .. nếu vậy, lý do là bất kỳ số nào ngoài điều kiện 0có nghĩa làtrue
Sundeep

Câu trả lời:


13

Đúng cho awk là một chuỗi không trống hoặc một số khác không (với các số là số nguyên thập phân hoặc dấu phẩy động và với một số triển khai awk thập lục phân hoặc bát phân cũng được hỗ trợ). Những thứ được đặt trong dấu ngoặc kép là các chuỗi, số không được trích dẫn là số, nhưng đối với bất kỳ thứ gì khác, có các quy tắc phức tạp để xác định xem một cái gì đó sẽ được coi là một chuỗi hay một số. awkHướng dẫn GNU có cả một chương về điều đó .

Thật:

  • awk '1' (số khác không)
  • awk '1e8' (số khác không)
  • awk '-0.01' (số khác không)
  • awk '"foo"' (chuỗi không trống)
  • awk '"0"' (chuỗi không trống)
  • awk '0 ""' (nối ghép mang lại một chuỗi mà ở đây không trống)
  • echo 0 | awk '$1 ""' (tương tự cho trường $ n)
  • awk 'substr("000", 1, 1)'(kết quả substr()luôn là một chuỗi)
  • echo '0foo' | awk '$0' ($ 0 là một chuỗi không phải là số nên được coi là một chuỗi (không trống))

Sai:

  • awk '0' (0 số)
  • awk '""' (chuỗi trống)
  • echo 0000e123 | awk '$1' ($ 1 được coi là một số nếu đó là một chuỗi số ở đây và là 0)
  • echo ' 0 ' | awk '$0' (khoảng trắng ở đầu và cuối được bỏ qua để xác định xem một chuỗi có phải là số không).
  • awk '" 2foo" - 2' (một chuỗi liên quan đến biểu thức số học được chuyển đổi thành một số có bất kỳ thứ gì vượt quá số bị bỏ qua)
  • awk 'unset_or_empty_variable' (chuỗi trống)
  • awk '"non-numerical-string" + 0'

YMMV:

  • awk '1e-500' (một số sẽ phàn nàn, một số sẽ coi nó là 0)
  • awk '"0x1" + 0'(không phải tất cả triển khai awk hỗ trợ hexadecimals, trên những mà "0x1"được chuyển thành 1, trong người khác 0. Một số phiên bản của đặc tả POSIX hiện thực vô tình cần thiết để hỗ trợ con số hex đó và nó được rút lại sau đó. Tuy nhiên gawkkhông nhận ra rằng số hex khi POSIXLY_CORRECTđang ở trong môi trường)
  • awk '010 - 8' (tương tự (cũng không hoàn toàn như 010 theo nghĩa đen ở đây trái ngược với chuyển đổi từ một chuỗi) cho các quãng tám)
  • awk '0x1 - 1'(trên các awktriển khai không hỗ trợ các số hex, 0x1là phép nối 0x1biến mang lại "0"số được chuyển đổi thành một số (0), nếu bạn trừ đi số 1bạn nhận được -1là số khác không).

Điều đó có nghĩa là nếu bạn muốn kiểm tra xem một chuỗi có trống không, bạn không nên làm:

awk '$ 1 {in $ 1, "không trống"}'

Nhưng

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

Nếu không, nó sẽ không nói 0hoặc -0000E+00001234không trống rỗng.


Câu trả lời ấn tượng và chi tiết! Một câu hỏi mặc dù: ở ví dụ cuối cùng bạn đưa ra, tôi đã thử cú pháp và câu đầu tiên hoạt động, trong đó nó bỏ qua $ 1 trống và chỉ in dòng đó với $ 1 không trống, vì nếu $ 1 là chuỗi trống thì nó sẽ là Sai, và do đó không in đầu ra, phải không?
sylye
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.