Os índices de matriz são números inteiros ou seqüências de caracteres entre aspas awk
. O que você está fazendo aqui está usando variáveis que ainda não foram inicializadas. Seus valores são, portanto, vazios.
Você obtém o valor mais recente atribuído à matriz porque cada atribuição está substituindo o valor anterior. Usar print arr[""]
também o 10
devolveria.
Em vez disso, use cadeias, como em arr["A"]=1
.
Para o seu último problema: Não existe um recurso real para inicializar uma awk
matriz a partir da linha de comando, mas você pode passar um valor "codificado" que você "decodifica" em seu BEGIN
bloco (por exemplo) para extrair as chaves e os valores de uma matriz.
Exemplo que passa uma lista especialmente delimitada como uma única sequência e a analisa para extrair os índices e valores a serem usados:
awk -v vals="A=1:B=1:C=1:E=1:J=8:Q=10" '
BEGIN {
n = split(vals, v, ":")
for (i = 1; i <= n; ++i) {
split(v[i], a, "=")
arr[a[1]] = a[2]
}
print arr["J"]
}'
Usando chaves e valores separados:
awk -v keys="A:B:C:E:J:Q" -v vals="1:1:1:1:8:10" '
BEGIN {
nk = split(keys, k, ":")
nv = split(vals, v, ":")
if (nk != nv) exit 1
for (i = 1; i <= nk; ++i)
arr[k[i]] = v[i]
print arr["J"]
}'
Essa é uma maneira bastante limitada de transmitir uma "matriz" awk
, mas funciona para valores simples sobre os quais se tem controle total. Os exemplos seriam quebrados para qualquer dado que incorpore dois pontos (e sinais de igual para o 1º exemplo) nos dados reais.
Passar dados como esse também significa que as barras invertidas nos dados terão que ser tratadas especialmente ( \n
será uma nova linha; portanto, para passar a cadeia de dois caracteres \n
, você precisará usar "\\\n"
ou '\\n'
).
Também relacionado:
Como um aparte, você pode escrever um " awk
script puro " como este:
#!/usr/bin/awk -f
BEGIN {
# some initialisations
}
some_expression { some code }
END {
# more here
}