Por que $ var dá o valor de $ 0?

3

Eu escrevi um script awk muito simples que inverte todas as palavras de um arquivo -:

awk '
{
for (i=1;i<=NF;i++)
{ x=""
for(j=length($i);j>0;j--)
x=x substr($0,j,1);
print x
}}' file1

O conteúdo do arquivo1 é o seguinte -:

hello

Agora, o que me deixa perplexo é quando eu substituo -:

print x

com

print $x

Eu recebo a saída do registro, ou seja. Eu recebo hello não a saída invertida que olleh .

Por que usar $ x me dá o conteúdo de $ 0? Como as variáveis funcionam no awk? É realmente confuso. Existe uma regra definida quando devo usar $ x e quando apenas x?

    
por Sreyan 23.11.2014 / 15:21

2 respostas

8

x é sua variável awk, $x é algo diferente ....

$0 corresponde ao conteúdo da string de entrada da linha que acabou de ler, enquanto $1 ... $n corresponde aos campos de divisão de $0 contents usando o separador padrão.

o awk permite que você acesse programaticamente os campos usando uma variável, ou seja, se a variável MyValue contiver 5 , $MyValue é igual a $5 .

O que acontece aqui é que sua variável x contém a string olleh , que é numericamente interpretada como 0 . No awk, todas as strings que começam com valores não numéricos quando usadas como valores numéricos são interpretadas como 0 , por exemplo, 5*"test" é avaliado como 0 porque "test" é interpretado como 0 ). Portanto, no seu caso, $x é o mesmo que $0 , que é a string de entrada fornecida, ou seja, hello .

    
por 23.11.2014 / 15:39
2

Primeiro, você deve saber qual é a variável válida em awk . POSIX definiu a variável awk como:

An operand that begins with an <underscore> or alphabetic character from the portable character set (see the table in XBD Portable Character Set), followed by a sequence of underscores, digits, and alphabetics from the portable character set, followed by the '=' character, shall specify a variable assignment rather than a pathname

Então, quando você tem uma awk variable x e deseja usar x , apenas faça referência a ela, escrevendo x diretamente, exemplo print x ou y = x .

Quando você usa $x , está acessando variáveis de campo awk . Em awk , as variáveis de campo são acessadas por $ , seguido por um número ou expressão numérica. Portanto, quando você escrever $x , awk avaliará x primeiro. Se x tiver um valor numérico, como 1 , a instrução se tornará $1 , awk fornecerá o valor da primeira variável de campo. Ou você tem uma expressão numérica como (1+1) , então $(1+1) se torna $2 , você obterá o valor da segunda variável de campo.

Observe que, quando a expressão do número de campo é avaliada como algo diferente de inteiro não negativo , o comportamento não é especificado (como x = "qwerty" ou x = "qwerty"+1 , então, acessar $x não é especificado) :

The effect of the field number expression evaluating to anything other than a non-negative integer is unspecified; uninitialized variables or string values need not be converted to numeric values in this context

No seu caso, sua implementação de awk teve a expressão de número de campo de avaliação (que é uma string) para 0 , então você obteve o valor da variável $0 . Em outras implementações awk , o resultado pode ser diferente (Pelo menos no OpenBSD awk , você receberá um erro illegal field ).

    
por 23.11.2014 / 18:14