Array-Indizes sind entweder Ganzzahlen oder Zeichenfolgen in Anführungszeichen awk
. Sie verwenden hier Variablen, die noch nicht initialisiert wurden. Ihre Werte sind daher leer.
Sie erhalten den neuesten Wert, der dem Array zugewiesen wurde, da jede Zuweisung den vorherigen Wert überschreibt. Die Verwendung print arr[""]
würde Ihnen auch etwas 10
zurückgeben.
Verwenden Sie stattdessen Zeichenfolgen wie in arr["A"]=1
.
Für Ihr letztes Problem: Es gibt keine echte Möglichkeit, ein awk
Array über die Befehlszeile zu initialisieren. Sie können jedoch einen "codierten" Wert übergeben, den Sie BEGIN
(beispielsweise) in Ihrem Block "decodieren" , um die Schlüssel und Werte für ein Array zu extrahieren.
Beispiel, bei dem eine speziell begrenzte Liste als einzelne Zeichenfolge übergeben und analysiert wird, um die zu verwendenden Indizes und Werte zu extrahieren:
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"]
}'
Verwenden separater Schlüssel und Werte:
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"]
}'
Dies ist eine recht eingeschränkte Methode zum Übergeben eines "Arrays" awk
, funktioniert jedoch für einfache Werte, über die man die vollständige Kontrolle hat. Die Beispiele würden für alle Daten unterbrochen, die Doppelpunkte (und Gleichheitszeichen für das erste Beispiel) in die tatsächlichen Daten einbetten.
Das Übergeben von Daten wie diesen bedeutet auch, dass Backslashes in den Daten speziell behandelt werden müssen ( \n
es handelt sich um eine neue Zeile. Um die zwei Zeichenfolgen zu übergeben \n
, müssten Sie "\\\n"
oder verwenden '\\n'
).
Auch verwandt:
Nebenbei können Sie ein "reines awk
Skript" wie folgt schreiben :
#!/usr/bin/awk -f
BEGIN {
# some initialisations
}
some_expression { some code }
END {
# more here
}