Realmente saia do script Awk

3

Perl e Ruby exit realmente saem:

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

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

Não é assim para o Awk:

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

Eu tentei resolver isso com um "help.awk"

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

mas isso cria seu próprio problema. Se "prog.awk" tiver apenas o bloco inicial:

BEGIN {
  print "start"
}

Em seguida, execute-o:

awk -f help.awk -f prog.awk

fará com que ele espere pela entrada. É uma solução melhor disponível, por realmente saindo de um script Awk?

    
por Steven Penny 31.03.2018 / 01:10

1 resposta

2

Se um programa Awk tiver um bloco "middle" ou END , a entrada será lida. Podemos contrarie isso fornecendo uma entrada nula:

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

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

Se quisermos que este seja o padrão, podemos adicionar um bloco a "help.awk":

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

No entanto, isso cria uma mudança importante; O awk não lerá do terminal, a menos que você adiciona um traço:

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

ou modifique "prog.awk":

getline < "-"

Exemplo de entrada de leitura:

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

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

Exemplo não lendo entrada:

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

$ awk -f help.awk -f prog.awk
start
    
por 31.03.2018 / 02:07