Diferença entre $ 1, $ {1} e $ “1” no awk

5

Enquanto trabalhava em um script, o seguinte script deu um erro

file * | awk '{ ${1}=""; print substr(${0},2) }';

enquanto os dois scripts a seguir foram executados com êxito

file * | awk '{ $"1"=""; print substr($"0",2) }';

e

file * | awk '{ $1=""; print substr($0,2) }';

Não são $1, ${1}, $"1" todas as substituições de parâmetros? Existe algum problema com a minha sintaxe awk ?

    
por GypsyCosmonaut 01.07.2017 / 08:20

1 resposta

11

awk não é o shell. awk tem sua própria gramática, sintaxe e semântica. ${1} não está sintaticamente correto awk code enquanto ambos $1 e $"1" são (e são equivalentes em awk ). Em awk , estas não são substituições.

Com awk , $1 refere-se ao primeiro campo do registro de entrada atual e $0 refere-se ao registro de entrada completo, enquanto no shell, $1 refere-se ao primeiro parâmetro posicional (geralmente o primeiro argumento na linha de comando de um script ou função) e $0 geralmente se refere ao nome do shell atual ou shell script.

As variáveis do shell e as variáveis awk também são completamente separadas. É por isso que awk tem o sinalizador de linha de comando -v para definir suas variáveis se você precisar "importar" um valor do shell para seu script awk :

$ awk -v var="$var" '{...}'

Você também pode atribuir ao script awk o valor de uma variável shell como esta:

$ awk '{...}' var="$var"

Isso é quase a mesma coisa que fazer com -v , exceto que a variável var estará vazia em qualquer bloco BEGIN . Um bloco BEGIN é executado antes olhando para os dados de entrada, e a variável é definida após a execução de tal bloco.

Você também pode fazer

$ awk '{...}' var="$value1" file1 var="$value2" file2

Isso faz com que a variável var obtenha o valor da variável de shell $value1 pouco antes de o file1 estar sendo processado e, em seguida, o valor da variável de shell $value2 antes de file2 estar sendo processado. / p>

Se algum arquivo tiver o nome var="$value1" no último exemplo (por exemplo, var="42" , que é um nome de arquivo Unix perfeitamente legal), esse arquivo não ser processado. Além disso, se um padrão de globbing de nome de arquivo de shell na linha de comando pegar um arquivo cujo nome se parece com uma atribuição a uma variável, essa atribuição estará ativa no script awk .

    
por 01.07.2017 / 08:33

Tags