awkは、数字(「40」)と数字などの文字(「203-344-1234」)を含む文字列をどのように比較しますか?

awkは、数字(「40」)と数字などの文字(「203-344-1234」)を含む文字列をどのように比較しますか?

テキストファイルがあります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'比較するためです。


比較タイプとは何ですか?

~から[GNU awk] 文字列型と数値型:

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

この例では、$4isは203-344-1234数値ではなく文字列です。 2番目の引数は文字列に変換された数値です'40'CONVFMT整数なので値は何でも)。


文字列または数字を強制的に入力する方法

同じページのいくつかの追加情報:

何らかの理由で数字を文字列に強制変換する必要がある場合は、数字を空の文字列に関連付けます""。文字列を数値に強制変換するには、文字列にゼロを追加します。

時には、フィールドが数字として使用されるようにすることで書かれます$1+0。たとえば、この場合、$4+0最初の3桁の整数になるように強制するには、203次のように始まるフィールドを作成します。数字以外の最初の文字は終了番号)。

おすすめ記事