É obrigatório ter uma variável na primeira declaração do awk?

0

Estou tendo dificuldades com o awk hoje. Se eu tentar fazer:

df|awk '{print $2; $some=$2; print $some}'

Funciona como esperado e eu recebo o tamanho dos discos duas vezes, mas se eu fizer isso:

df|awk '{$some=$2; print $some}'

Acabei de receber linhas em branco. Por que isso está acontecendo? Algo está errado no meu entendimento, mas por que o uso de um campo obrigatório para os campos subseqüentes funcionarem? Eu também tentei fazer:

df|awk '{print "hello"; $some=$2; print $some}'

e eu recebo um "olá", cada um separado por uma nova linha. Onde está $ some = $ 2 perdido?

Meu comando df gera:

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       38448788 32098732   4396932  88% /
udev             1914564        4   1914560   1% /dev
tmpfs             768744      984    767760   1% /run
    
por Aditya Patawari 08.03.2013 / 11:48

3 respostas

3

Você não deve usar o $ -sign na frente de some . O que acontece é que, com o primeiro comando, $2 é impresso e $some=$2 é convertido em $0=$2 , pois some é unitalizado (em awk implementations some é convertido de "" para 0 , nem todos (então você recebe uma mensagem de erro)), então você está substituindo o registro ( $0 ) por $2 . Então você imprime $some , o que significa $0 Então é idêntico a

df|awk '{print $2; $0=$2; print $0}'

e

df|awk '{$0=$2; print $0}'

O que você provavelmente pretendia fazer era:

df|awk '{print $2; some=$2; print some}'
    
por 08.03.2013 / 12:29
1

Eu obtenho o resultado esperado. O primeiro comando imprime cada item duas vezes. O segundo comando imprime uma vez.

Isso não é convencional - "alguns" terá o valor zero por padrão, já que é indefinido. $ some é, portanto, $ 0, que representa a linha inteira, então basicamente você está substituindo a linha com o que você encontra em $ 2 quando usa $some=$2

Compare com este resultado:

johan@computer:~$ df|awk '{$some=$2; print}'
1K-blocks
30827524
4041028
1621692
5120
4054228
102400
4054228
60555340
209548784

Por que você não obteria nenhum resultado ou um resultado diferente: espero que o comportamento de usar variáveis não iniciadas seja potencialmente indefinido, pelo menos em alguns sistemas.

No Solaris eu tenho acesso ao awk "padrão", bem como à versão supostamente compatível com POSIX instalada em / usr / xpg4 / bin / awk. Ambos produzem o mesmo resultado para o seguinte

Eles produzem resultados variados dependendo se eu adiciono print "hello" na frente ou não, e se eu substituo o último comando por "print" (em vez de print $ some) ou não.

Todos eles imprimem ALGO, não em branco, embora - não consegui encontrar uma versão que reproduza esse efeito.

Então, espero que isso seja algum tipo de comportamento indefinido devido ao uso de uma variável não inicializada - você está atribuindo um valor a uma coluna, que está potencialmente muito além do fim do possível intervalo de colunas no fluxo de entrada. $ some refere-se a uma coluna identificada pelo valor de "some"

Você deve usar apenas "alguns" como variável, por exemplo

df | awk '{print "hello";some=$2; print some}'
    
por 08.03.2013 / 12:32
-2

Eu acho que a razão disso aconteceu porque o Ubuntu não usa o padrão de implantação GNU, mas algo mais conhecido como mawk, que quebra um monte de código que funcionava sob o unix padrão.

Por favor, consulte este link para uma discussão similar.

    
por 08.03.2013 / 12:26

Tags