Awk
在這種情況下,awk 如何進行比較?
我有一個文本文件
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
您可以進一步閱讀這是如何完成的,按照上面的連結,字元串是通過呼叫
sprintf
with formatting來創建的CONVFMT
,這是預設的"%.6g"
等。對於這種情況,
$4
,203-344-1234
是一個字元串,而不是一個數字。第二個參數是一個數字,轉換為字元串"4"
等"65"
。還有一些附加資訊,來自同一手冊頁:
如果出於某種原因,您需要強制將數字轉換為字元串,請將該數字與空字元串
""
. 要強制將字元串轉換為數字,請將零添加到該字元串有時,為了確保欄位可以用作數字,我們將其寫成
$1+0
. 例如,在這種情況下,如果我們強制$4+0
它將是一個前三位數字的整數,203
(就是這樣,創建數字的嘗試在第一個非數字字元處結束)。另請參閱 GNU awk 手冊頁:字元串類型與數字類型