제가 파일에서 읽고 있는 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"
}
관련된: