私がファイルから読んでいる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"
}
関連: