Fare riferimento agli elementi dell'array mediante stringhe e inizializzare gli array in awk


8
#!/usr/bin/env bash
awk '
  BEGIN {
    arr[A]=1;
    arr[B]=1;
    arr[C]=1;
    arr[E]=1;
    arr[J]=8;
    arr[Q]=10;
    print arr[J]
  }'

il comando sopra emette l'ultimo valore impostato per arr['subscript'], in questo caso 10questo è il valore di arr[Q]poco prima printe non 8quello di arr[J].

Inoltre, come nello script sopra, non voglio assegnare valori a arr['A'], arr['B'], arr['C'] and arr['E']quello stesso valore 1una riga alla volta, piuttosto passare una matrice di pedici come uno dei parametri e valore comune dell'altro parametro a una funzione che gestisce la logica di assegnare loro valore.

Risposte:


16

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 10restituirebbe.

Invece, usa le stringhe, come in arr["A"]=1.

Per il tuo ultimo problema: non esiste una reale possibilità di inizializzare un awkarray dalla riga di comando, ma potresti passare un valore "codificato" che "decodifichi" nel tuo BEGINblocco (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 ( \nsarà 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 " awksceneggiatura pura " come questa:

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.