Eu só quero implementar if condição em awk. Eu criei um nome de arquivo: "simple_if" como abaixo.
BEGIN{
num=$1;
if (num%2==0)
printf "%d is Even number.\n",num;
else printf "%d is odd Number.\n",num
}
Então eu executei o programa passando 10 como argumento para $ 1 como abaixo
awk -f simple_if 10
Mas não recebe entrada e, em vez disso, exibe 0. Saída:
0 is Even number.
Como obter valor do usuário em awk?
Os argumentos fornecidos no final da linha de comando
awk
são geralmente considerados como nomes de arquivos dos quais oawk
script será lido. Para definir uma variável na linha de comando, use-v variable=value
, por exemploIsso permitiria que você usasse
num
como uma variável em seu script. O valor inicial da variável será 10 no exemplo acima.Você também pode ler variáveis de ambiente usando
ENVIRON["variable"]
em seu script (para alguma variável de ambiente chamadavariable
), ou olhar para os argumentos da linha de comandoARGV[n]
onden
é algum inteiro positivo.Com
$1
inawk
, você faria referência ao valor do primeiro campo no registro atual, mas como você o está usando em umBEGIN
bloco, nenhum dado foi lido de nenhum arquivo.O número em seu código está sendo interpretado como zero, pois é uma variável vazia usada em um contexto aritmético.
$1
não é o primeiro argumento da linha de comando, mas o primeiro campo após a divisão da linhaFS
(e será a string vazia emBEGIN
, já que nenhuma linha foi dividida ainda).Os argumentos da linha de comando estão na matriz
ARGV
:ARGV[0]
é sempre o nome do interpretador (awk
ougawk
, etc).Para permitir
awk
ignorar um argumento de linha de comando e não tentar abri-lo mais tarde como um arquivo, você deve excluí-lo ou configurá-lo para a string vazia: por exemplo.ARGV[1]=""
.Como uma nota lateral, qualquer argumento do formulário
var=value
também será interpretado como uma atribuição de variável porawk
, e será avaliado após o processamento dos argumentos do arquivo que o precedem:Para usar um nome de arquivo real do formulário
key=val
comawk
, você deve passá-lo como um caminho relativo ou absoluto, por exemplo.awk '{...}' ./key=val
.Como já foi apontado, nenhuma entrada está sendo lida na seção BEGIN. Você pode fazer seu código executar conforme o esperado, se você verificar a primeira linha de entrada e fornecer o número em stdin:
O Awk regular não tem problemas para processar argumentos de linha de comando como qualquer outro programa semelhante a C faria, sem recorrer a qualquer
gawk
comportamento específico do GNU, pipes ou redirecionamento (<
), ou a-v
opção (atribuição de variável).O manuseio de argumentos de entrada
ARGC
(o argumento count , um inteiro) eARGV
(o argumento vetor , outra palavra para "lista") são abordados em detalhes no manual .Mosvy fez um ótimo trabalho explicando o histórico e resumindo o que precisa ser feito para analisar arquivos
ARGV
. Aqui está o seu objetivo original, implementado como um script de shell autônomo, testado no macOS e no GNU/Linux.simple_if.awk
Faça um script Awk como este executável com
chmod a+x scriptname.awk
, coloque-o em seu$PATH
, e ele pode ser executado como qualquer outro script Bash, Python, Perl, programa C, o que for.Se
awk
existir em algum outro lugar do seu sistema, atualize a#!
linha apropriadamente; pode não ser possível usar/usr/bin/env
porqueawk
deve ter a-f
opção de rodar seu script, e… é complicado .A
.awk
extensão não é necessária , mas pode ajudar seu editor a habilitar o realce de sintaxe adequado. Deixe-o desligado e ninguém precisa saber que é um script Awk.Aqui está um exemplo mais completo que faz algo útil e tem um tratamento de erros razoável:
simple_stats.awk