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

おすすめ記事