53
  1. AWKスクリプトを使用していくつかのログを処理しています。
  2. ある場所で、変数値がnullかを確認して、決定を下す必要があります。

同じことを達成する方法はありますか?

awk '

{
    {
       split($i, keyVal, "@")
       key=keyVal[1];
       val=keyVal[2];
       if(val ~ /^ *$/)
       val="Y";

    }

}

' File

私はで試しました

1) if(val == "")

2) if(val ~ /^ *$/)

どちらの場合も機能しません。

4

3 に答える 3

63

との比較""はうまくいくはずだったので、それは少し奇妙です

length()もう1つの方法として、関数を使用できます。ゼロの場合、変数はnull/空です。例えば、

if (length(val) == 0)

また、組み込み変数NF(フィールド数)が役立つかもしれませんか?入力データにアクセスできないため、言うのは難しいですが、別の可能性があります。

于 2012-08-14T13:06:24.403 に答える
16

比較せずに変数を直接使用できます。空/null/ゼロの値が考慮されfalse、それ以外はすべてですtrue

ここを参照してください:

# setting default tag if not provided
if (! tag) {
        tag="default-tag"
}

したがって、このスクリプトには、ユーザーが次のように呼び出す場合を除いtagて、値を持つ変数が含まれます。default-tag

$ awk -v tag=custom-tag -f script.awk targetFile

これは、GNU Awk 4.1.3、API:1.1(GNU MPFR 3.1.4、GNU MP 6.1.0)の時点で当てはまります。

于 2017-08-24T14:41:51.327 に答える
13

それは私にとってはうまくいきます

$ awk 'BEGIN{if(val==""){print "null or empty"}}'
null or empty

変数が空であるかnullであるかを区別することはできません。「未設定」変数にアクセスすると、awkはデフォルト値(ここでは""-空の文字列)で初期化します。ある種の回避策を使用できます。たとえば、変数にアクセスするときにval_accessed変数をに設定してからに設定します。または、valを(またはプログラムの実行時に表示されない他の値に)設定する、より単純なアプローチ(やや「ハック」 )。01"unitialized"

PS:あなたのスクリプトは私には奇妙に見えますが、ネストされた角かっこは何のためにありますか?

于 2012-08-14T13:15:14.883 に答える