Awk 스크립트를 종료하시겠습니까?

Awk 스크립트를 종료하시겠습니까?

Perl과 Ruby는 exit실제로 종료했습니다.

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1

그러나 Awk의 경우는 그렇지 않습니다.

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2

"help.awk"를 사용하여 이 문제를 해결하려고 했습니다.

function really_exit() {
  IM_SURE = 1
  exit
}
END {
  if (IM_SURE) {
    exit
  }
}

그러나 이것은 그 자체로 문제를 야기합니다. "prog.awk"에 시작 블록만 있는 경우:

BEGIN {
  print "start"
}

그런 다음 실행하십시오.

awk -f help.awk -f prog.awk

입력을 기다리는 동안 중단됩니다. 실제로 Awk 스크립트를 종료하는 더 나은 솔루션이 있습니까?

답변1

awk 프로그램에 "중간" 또는 블록이 있으면 END입력을 읽습니다. 빈 입력을 제공하여 이 문제를 해결할 수 있습니다.

$ cat prog.awk
1
END {
  print "fin"
}

$ awk -f prog.awk /dev/null
fin

이것이 기본값이 되도록 하려면 "help.awk"에 블록을 추가할 수 있습니다.

BEGIN {
  if (ARGC == 1 && !system("[ -t 0 ]")) {
    ARGV[ARGC++] = "/dev/null"
  }
}

그러나 이로 인해 중요한 변경 사항이 발생합니다. 대시를 추가하지 않으면 awk는 터미널에서 데이터를 읽지 않습니다.

awk -f help.awk -f prog.awk -

또는 "prog.awk"를 수정하세요:

getline < "-"

입력 예 읽기:

$ cat prog.awk
/4/ {
  really_exit()
}
1
END {
  print "fin"
}

$ seq 10 | awk -f help.awk -f prog.awk
1
2
3

입력을 읽지 않는 예:

$ cat prog.awk
BEGIN {
  print "start"
  really_exit()
}
END {
  print "fin"
}

$ awk -f help.awk -f prog.awk
start

관련 정보