Los índices de matriz son enteros o cadenas entre comillas awk
. Lo que está haciendo aquí es usar variables que aún no se han inicializado. Sus valores, por lo tanto, están vacíos.
Obtiene el último valor asignado a la matriz porque cada asignación sobrescribe el valor anterior. Usar print arr[""]
también te 10
devolvería.
En su lugar, use cadenas, como en arr["A"]=1
.
Para su último problema: no hay una instalación real para inicializar una awk
matriz desde la línea de comando, pero puede pasar un valor "codificado" que "decodifica" en su BEGIN
bloque (por ejemplo) para extraer las claves y los valores de una matriz.
Ejemplo que pasa una lista especialmente delimitada como una sola cadena y la analiza para extraer los índices y valores a usar:
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 claves y 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"]
}'
Esta es una forma bastante limitada de pasar una "matriz" awk
, pero funciona para valores simples sobre los que uno tiene control total. Los ejemplos se romperían para cualquier dato que incorpore dos puntos (y signos iguales para el primer ejemplo) en los datos reales.
Pasar datos como este también significa que las barras invertidas en los datos deberán tratarse especialmente ( \n
será una nueva línea, por lo que para pasar la cadena de dos caracteres \n
, debería usar "\\\n"
o '\\n'
).
También relacionado:
Como comentario aparte, puede escribir un " awk
guión puro " como este:
#!/usr/bin/awk -f
BEGIN {
# some initialisations
}
some_expression { some code }
END {
# more here
}