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

이는 쉼표로 구분된 파일의 행을 반복하고 필드를 사용하여 ifreturn문을 출력합니다. 입력 파일에 있는 만큼의 행이 있습니다.

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

관련된:

관련 정보