Argumento da linha de comando no awk

4

Eu só quero implementar se condição no 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 é necessária entrada e exibe 0. Saída:

0 is Even number.

Como obter valor do usuário no awk?

    
por Dip 12.10.2018 / 11:30

3 respostas

10

Argumentos dados no final da linha de comando para awk são geralmente tomados como nomes de arquivos dos quais o script awk irá ler. Para definir uma variável na linha de comando, use -v variable=value , por exemplo,

awk -v num=10 -f script.awk

Isso 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 chamada variable ), ou veja os argumentos de linha de comando com ARGV[n] onde n é algum inteiro positivo.

Com $1 em awk , você se referiria ao valor do primeiro campo no registro atual, mas desde que você o está usando em um bloco BEGIN , nenhum dado ainda foi lido de nenhum arquivo.

O número em seu código está sendo interpretado como zero, já que é uma variável vazia usada em um contexto aritmético.

    
por 12.10.2018 / 11:39
7

$1 não é o primeiro argumento de linha de comando, mas o primeiro campo após a linha foi dividido com FS (e será a string vazia em BEGIN , já que nenhuma linha foi dividida ainda).

Argumentos da linha de comando estão na matriz ARGV :

$ awk 'BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }' 1st 2nd 3rd
1st
2nd
3rd

ARGV[0] é sempre o nome do interpretador ( awk ou gawk , etc).

Para permitir que awk ignore um argumento de linha de comando e não tente abri-lo posteriormente como um arquivo, você deve excluí-lo ou configurá-lo para a cadeia vazia: por exemplo. ARGV[1]="" .

Como uma observação, qualquer argumento do formulário var=value também será interpretado como uma atribuição de variável por awk , e será avaliado após os argumentos de arquivo que o precedem processado:

$ echo yes > file
$ awk '{ gsub(/e/, var); print }' var=1 file var=2 file var=3 file
y1s
y2s
y3s

Para usar um nome de arquivo real do formulário key=val com awk , você deve passá-lo como um caminho relativo ou absoluto, por exemplo. awk '{...}' ./key=val .

    
por 12.10.2018 / 11:41
1

Como já foi apontado, nenhuma entrada está sendo lida na seção BEGIN. Você poderia fazer seu código executar como esperado, se você verificar a primeira linha de entrada e fornecer o número em stdin:

echo 10 | awk 'NR==1{
num=$1;
if (num%2==0)
printf "%d is Even number.\n",num;
else printf "%d is odd Number.\n",num
}'
10 is Even number.
    
por 12.10.2018 / 12:54