Eu quero um script para tornar o awk uma calculadora matemática interativa, para avaliar expressões matemáticas dadas em cada linha.
Ou seja, ao invés de construir comandos awk para calcular expressões como as seguintes:
$ awk 'BEGIN{print 180/1149}'
0.156658
$ awk 'BEGIN{print (150+141)/1149}'
0.253264
Quero que meu script receba minhas expressões matemáticas como entrada e faça o cálculo de forma interativa. Então a sessão ficará assim (alternativa de entrada e saída):
180/1149
0.156658
(150+141)/1149
0.253264
1 + 2
3
2 * 3 - 5
1
No entanto, não consigo fazer isso sozinho:
$ awk '{print}'
180/1149
180/1149
^C
$ awk '{print $0}'
180/1149
180/1149
1 + 2
1 + 2
^C
Se não houver uma solução simples para o awk, o que mais, como o perl?
A avaliação aritmética é feita como parte da avaliação da linguagem
awk
/perl
.perl
tem umeval
para avaliar strings arbitrárias como código perl em tempo de execução, então você pode fazer:Mas
awk
não (embora no caso de GNUawk
, seu depurador faça, veja abaixo), então você precisa executarawk
para cada linha de entrada e passar o conteúdo dessa linha dentro do argumento de código, por exemplo, usando GNUxargs
:Você também pode fazer:
Para executar um
awk
para interpretar todas as linhas de código, masawk
só começaria a avaliá-lo ao chegar ao final da entrada, portanto, não pode ser usado interativamente. Você seria capaz de reutilizar os resultados de uma avaliação anterior, como noperl
entanto. Como em:Seria impresso
7
, então14
.Usando o depurador do gawk
awk
tem um modo de depurador que possui umeval
para o qual você pode passar o código awk para interpretar, então você pode sequestrar isso com algo como:Interativamente, basta usar bc
Não interativamente, se você quiser fazer o script da avaliação das expressões:
Para intercalar a entrada e a saída, podemos usar colar
Execute-o com perl!
...ou também podemos usar o awk. Considere o seguinte script awk (de segunda ordem)
run-in-awk
depois de
chmod +x run-in-awk
estarmos de fato pedindo ao awk para executar o awkEle também funciona com entrada de teclado stdin.
Por que apenas awk ou perl quando podemos usar sh com awk?
Isso lerá uma expressão e a salvará em uma variável. Então o awk print é chamado e a variável é passada. Este é um loop infinito que sai em control-c.
Um nome de variável tão estranho é usado para proteger o script de alterar as variáveis de outros scripts.