テキストファイルがあります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
。比較を実行できないというエラーが発生するのではなく、フィールドの最初の2桁の数字のみを比較するようです。
awk
私の質問は:この場合、どのように比較/動作しますか?ありがとうございます。
答え1
簡単に言えば、これはGNUのアルファベット順の比較ですawk
。
'203-344-1234'
文字列()と数字()を'40'
比較するためです。
比較タイプとは何ですか?
2つのオペランドを比較するときは、文字列比較または数値比較を使用できます。これは、次の対称行列によるオペランドの属性に依存します。
+--------------------------------------------------------- | STRING NUMERIC STRNUM +--------------------------------------------------------- | STRING | string string string | NUMERIC | string numeric numeric | STRNUM | string numeric numeric +---------------------------------------------------------
数値を文字列に変換する方法
~から[GNU awk]比較演算子:
混合型のオペランドを比較すると、数値オペランドは使用された値を文字列に変換します
CONVFMT
(参照: 文字列と数値の変換)。
上記のリンクでは、比較のために数値を文字列に変換する方法を見ることができます。文字列はsprintf()
awk 事前定義変数を呼び出して生成され、書式設定され、デフォルトCONVFMT
で"%.6g"
は最大 6 つの小数点数を保持します。しかし、整数の場合:
特別なケースでは、数値が整数の場合、それを文字列に変換した結果は値に関係なく常に整数です
CONVFMT
。
この例では、$4
isは203-344-1234
数値ではなく文字列です。 2番目の引数は文字列に変換された数値です'40'
(CONVFMT
整数なので値は何でも)。
文字列または数字を強制的に入力する方法
同じページのいくつかの追加情報:
何らかの理由で数字を文字列に強制変換する必要がある場合は、数字を空の文字列に関連付けます
""
。文字列を数値に強制変換するには、文字列にゼロを追加します。
時には、フィールドが数字として使用されるようにすることで書かれます$1+0
。たとえば、この場合、$4+0
最初の3桁の整数になるように強制するには、203
次のように始まるフィールドを作成します。数字以外の最初の文字は終了番号)。