.cfg ファイルを .awk ファイルに

.cfg ファイルを .awk ファイルに

私がファイルから読んでいるcolor.cfgファイルは次のとおりです。

marks,<,80,green
marks,>,80,yellow

上記のcolor.cfgファイルを次のようにcolor.awkに変換したいと思います。

function check()
{
if ( marks < 80 )
 return "green"
if (marks > 800)
return "yellow"
}

.cfgを.awkに変換する以下のシェルスクリプトがあります。

LINECT=0

while read LINE
 do
 var1[$LINECT]=$(echo $LINE | cut -d ',' -f1)
 var2[$LINECT]=$(echo $LINE | cut -d ',' -f2)
 var3[$LINECT]=$(echo $LINE | cut -d ',' -f3)
 var4[$LINECT]=$(echo $LINE | cut -d ',' -f4)
 LINECT=$((LINECT+1))
 done < color.cfg

echo ${var1[@]}
echo ${var2[@]}
echo ${var3[@]}
echo ${var4[@]}

echo $LINECT

cat <<EOF > color.awk
function check()
{
if (${var1[0]} ${var2[0]} ${var3[0]} )
return "${var4[0]}"
}

EOF

私の質問は、color.awkを書くときに繰り返される「ifブロック」を書く方法です。

ifブロックを一度作成しましたが、条件が2つ、3つ、4つあればどのように作成しますか?

cat <<EOF > color.awk
function check()
{
if (${var1[0]} ${var2[0]} ${var3[0]} )
return "${var4[0]}"
}
EOF

答え1

awk関数を生成するためにスクリプトを使用するのはawk合理的です...

$ awk -f script.awk file
function check() {
        if (marks < 80) return "green"
        if (marks > 80) return "yellow"
}

script.awkどこ

BEGIN {
    FS = ","
    printf("function check() {\n")
}

{
    printf("\tif (%s %s %s) return \"%s\"\n", $1, $2, $3, $4)
}

END {
    printf("}\n")
}

ifこれは、カンマ区切りのファイルの行を繰り返し、フィールドを使用してreturn文を出力します。入力ファイルにあるだけの行があります。

BEGINブロックはENDヘッダーとフッター機能を実行し、BEGINブロックはさらに入力フィールド区切り文字をコンマに設定します。

入力が有効であることを確認しません。これはスクリプト本体の基本ブロックに入ることができます。

スクリプトの出力をファイルにリダイレクトしますcolor.awk

入力ファイルに追加の行を追加します。

marks,==,80,red

続く

function check() {
        if (marks < 80) return "green"
        if (marks > 80) return "yellow"
        if (marks == 80) return "red"
}

関連:

関連情報