AWKでIF文を使用する

AWKでIF文を使用する

私は大きなスクリプトを書いていますが、誰かが私を助けることができれば、この部分で詰まっていました。

サンプルファイルです

31:49.9,9.92,TCP ,1_19,490,EXT_SERVER,22,5,257,1,.ASF,0,normal

これは私のスクリプトの一部です

read -p "Please input the function itself ex, > : " function
read -p "Please input the value: " value

このように使うと私によく合う

cat temp | awk -F',' -v val="$value" '{if($8 > val) print $0}' > $destfile

しかし、このように使用しようとすると

cat temp | awk -F',' -v val="$value" -v fn="$function" '{if($8 fn val) print $0}' > $destfile

ありがとう

ベストアンサー1

変数の内容に基づいて実行時に演算子を生成できるプログラミング言語はあまりありません。コードを分析するとき、if文の条件式は構文的に有効でなければなりませんが、そうではありません。$number variable variable

(もちろんシェルおよびtest/[またはegで行うことができますが、これはコマンドであり、その引数はシェルが変数を展開した後に解析されるため[ "$a" "$op" "$b" ]です。)[

あなたはいくつかの選択肢があります。

awkがコードを解析する前に、次のようにシェル拡張演算子を使用できます。

cat temp | awk -F',' -v val="$value" '
               {if($8 '"$function"' val) print $0}' > $destfile

その後、たとえば$function含まれている場合は、<awkでこれを見ることができます{if($8 < val) ...。これにより、$functionawkを実行する前に、その演算子が許容可能な演算子であることを確認する必要があります。そうしないと、ユーザーに信じられないほどの構文エラーが発生する可能性があります。


別のオプションとして、ユーザーは下限と上限を入力し、コードで常に両方を確認できます。ユーザーが下限/上限を別々に入力したくない場合は、たとえば、-inf十分に低い/高い値を別のものに置き換えます。+inf

read -p "Please enter lower limit: " lo
read -p "Please enter upper limit: " hi
cat temp | awk -F',' -v lo="${lo:--inf}" -v hi="${hi:-+inf}" '
               {if (lo <= $8 && $8 <= hi) print $0}' > $destfile

-inf/は+infGNU awkとBusyboxで直接動作しているようですが、mawkは同じ数字を使用するように強制する必要があるようですlo + 0 <= $8。)


私の考えでは、GNU awkの3番目のオプションは、提供したいさまざまな比較演算子の関数を作成して使用することです。間接関数の呼び出し変数に与えられた名前に基づいてそのうちの1つを呼び出します。

たとえば、より小さいテストとより大きいテストの場合:

read -p "Please input the function (lt or gt): " op
read -p "Please input the value: " value
cat temp | gawk -F',' -v op="$op" -v val="$value" '
                function lt(a, b) { return a < b; }
                function gt(a, b) { return a > b; }
                {if (@op($8, val)) print $0}'

もちろん、この方法の欠点は明示的に生成する必要があることです。みんな関数にユーザーが誤った関数名を入力すると、エラーが発生します。

おすすめ記事