Awk

在這種情況下,awk 如何進行比較?

  • April 27, 2022

我有一個文本文件employees

Chen Cho 5/19/63 203-344-1234 $76
Tom Billy 4/12/45 913-972-4536 $102
Larry White 11/2/54 908-657-2389 $54
Bill Clinton 1/14/60 654-576-4114 $201
Steve Ann 9/15/71 202-545-8899 $58

當我這樣做時awk '$4 < 40' employees,我得到:

203-344-1234
202-545-8899

它提供相同的輸出,直到< 65我比較時$4 < 66,我得到:

203-344-1234
654-576-4114
202-545-8899

我對這種行為感到困惑awk。似乎它只是比較該欄位的前兩位數字,而不是拋出一些錯誤,說明無法進行比較或其他什麼。

我的問題是:awk在這種情況下比較/表現如何?謝謝你。

簡而言之,這是 GNU 的字母比較awk

來自GNU awk 手冊

比較混合類型的操作數時,數字操作數使用以下值轉換為字元串CONVFMT

您可以進一步閱讀這是如何完成的,按照上面的連結,字元串是通過呼叫sprintfwith formatting來創建的CONVFMT,這是預設的"%.6g"等。

對於這種情況,$4,203-344-1234是一個字元串,而不是一個數字。第二個參數是一個數字,轉換為字元串"4""65"


還有一些附加資訊,來自同一手冊頁:

如果出於某種原因,您需要強制將數字轉換為字元串,請將該數字與空字元串"". 要強制將字元串轉換為數字,請將零添加到該字元串

有時,為了確保欄位可以用作數字,我們將其寫成$1+0. 例如,在這種情況下,如果我們強制$4+0它將是一個前三位數字的整數,203(就是這樣,創建數字的嘗試在第一個非數字字元處結束)。


另請參閱 GNU awk 手冊頁:字元串類型與數字類型

引用自:https://unix.stackexchange.com/questions/700481