我正在读取文件的 color.cfg 文件如下。
marks,<,80,green
marks,>,80,yellow
我想将上面的 color.cfg 文件转换为 color.awk 如下
function check()
{
if ( marks < 80 )
return "green"
if (marks > 800)
return "yellow"
}
我有一个如下所示的 shell 脚本,用于将 .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"
}
有关的: