Gli indici di matrice sono numeri interi o stringhe tra virgolette awk
. Quello che stai facendo qui sta usando variabili che non sono state ancora inizializzate. I loro valori sono quindi vuoti.
Si ottiene l'ultimo valore assegnato all'array perché ogni assegnazione sovrascrive il valore precedente. Anche l'utilizzo print arr[""]
ti 10
restituirebbe.
Invece, usa le stringhe, come in arr["A"]=1
.
Per il tuo ultimo problema: non esiste una reale possibilità di inizializzare un awk
array dalla riga di comando, ma potresti passare un valore "codificato" che "decodifichi" nel tuo BEGIN
blocco (ad esempio) per estrarre le chiavi e i valori di un array.
Esempio che passa un elenco appositamente delimitato come una singola stringa e lo analizza per estrarre gli indici e i valori da usare:
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"]
}'
Utilizzo di chiavi e valori separati:
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"]
}'
Questo è un modo abbastanza limitato di passare un "array" in awk
, ma funziona per valori semplici su cui si ha il controllo completo. Gli esempi si spezzerebbero per qualsiasi dato che incorpori due punti (e segni uguali per il primo esempio) nei dati effettivi.
Passare dati come questo significa anche che le barre rovesciate nei dati dovranno essere trattate in modo speciale ( \n
sarà una nuova riga, quindi per passare la stringa di due caratteri \n
, dovresti usare "\\\n"
o '\\n'
).
Correlati anche:
A parte questo, puoi scrivere una " awk
sceneggiatura pura " come questa:
#!/usr/bin/awk -f
BEGIN {
# some initialisations
}
some_expression { some code }
END {
# more here
}