Configura o array awk na linha de comando?

6

Eu sei que a opção -v pode ser usada para awk na linha de comando para definir o valor de uma variável.

Existe alguma maneira de definir valores para elementos da matriz awk na linha de comando?

Algo como:

awk -v myarray[index]=value -v myarray["index two"]="value two" 'BEGIN {...}'
    
por Wildcard 12.01.2016 / 17:18

3 respostas

6

Não. Não é possível atribuir variáveis não-escalares como esta na linha de comando. Mas não é muito difícil fazê-lo.

Se você puder aceitar um nome de matriz fixo:

awk -F= '
  FNR==NR { a[$1]=$2; next}
  { print a[$1] }
' <(echo $'index=value\nindex two=value two') <(echo index two)

Se você tiver um arquivo contendo a sintaxe awk para definições de array, você pode include it:

$ cat <<EOF >file.awk
ar["index"] = "value"
ar["index two"] = "value two"
EOF

$ gawk '@include "file.awk"; BEGIN{for (i in ar)print i, ar[i]}'

ou

$ gawk --include file.awk 'BEGIN{for (i in ar)print i, ar[i]}'

Se você realmente quiser, pode executar gawk com -E em vez de -f , o que deixa você com uma linha de comando não interpretada. Você pode então processar essas opções de linha de comando (se parecer uma atribuição de variável, atribua a variável). Se você quiser seguir esse caminho, pode ser útil consultar ngetopt.awk .

    
por 12.01.2016 / 17:53
2

Com POSIX awk , você não pode fazer isso.

A atribuição no formulário -v assignment foi definida como:

An operand that begins with an 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. The characters before the '=' represent the name of an awk variable; if that name is an awk reserved word (see Grammar) the behavior is undefined

Isso só permite awk variable nome .

Quando você define o elemento awk array como:

myarray[index]=value

myarray[index] é lvalue , não variável nome . Então é ilegal.

Quaisquer variáveis e campos podem ser definidos com:

lvalue = expression

com lvalue pode ser variável, matriz com índice ou seletor de campos.

    
por 12.01.2016 / 17:54
0

Como é isso?

awk _F";" -v M=JanFebMarAprMayJunJulAugSepOctNovDec '$1>=180525 && $1<=180630\
{ m=substr($1,3,2); m=(m-1)*3+1; printf(" %s %d, 20%d\t%s\n",substr(M,m,3),\
substr($1,5,2),substr($1,1,2),$0);}' Filename

Arquivo delimitado por ";". Primeiro campo é data formatada yymmdd. Use string como array. Isso é trapaça?

    
por 07.07.2018 / 18:43