.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"
}

我有一个如下所示的 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")
}

这只是循环遍历逗号分隔文件中的行,并使用字段来输出ifreturn语句。其中的行数与输入文件中的行数一样多。

我让BEGINEND块执行函数页眉和页脚,并且该BEGIN块另外将输入字段分隔符设置为逗号。

不检查输入是否有效。这可能会进入脚本正文的主要块。

将脚本的输出重定向到文件,例如color.awk.

在输入文件中添加额外的一行,

marks,==,80,red

会导致

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

有关的:

相关内容