Ricerca…


Assegnazione variabile da linea di comando

Per assegnare variabili dalla riga di comando, -v può essere usato:

$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello

Nota che non ci sono spazi attorno al segno di uguale.

Questo permette di usare le variabili di shell:

$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello

Inoltre, questo permette di impostare le variabili incorporate che controllano awk :

Guarda un esempio con FS (separatore di campo):

$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4

O con OFS (separatore di campo di output):

$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3

Passare i parametri a un programma usando l'opzione -v

L'opzione -v seguita da un'assegnazione della variabile forma = valore può essere utilizzata per passare parametri ad un programma awk . Questo è illustrato dal programma di punizione qui sotto, il cui compito è di scrivere il conteggio delle volte la frase "Non parlerò in classe." Sullo standard output. Nell'esempio seguente viene utilizzato il valore 100, molto popolare tra gli insegnanti:

awk -v count=100 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print("I shall not talk in class.")
  }
  exit
}'

È possibile passare più parametri con l'uso ripetuto del flag -v :

awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print(sentence)
  }
  exit
}'

Non esiste un supporto integrato per i parametri array o list, questi devono essere gestiti manualmente. Un approccio classico per passare un parametro lista è per concatenare l'elenco utilizzando un delimitatore, scelte popolari sono : , | o , . La funzione di divisione consente quindi di recuperare l'elenco come array awk :

awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
  list_sz = split(serialised_list, list, ":")
  for(i = 1; i <= list_sz; ++i) {
    printf("list: %d: %s\n", i, list[i])
  }
  exit
}'

L'output di questo programma awk è

list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f

A volte è più conveniente recuperare gli elementi della lista come chiavi di un array awk , in quanto ciò consente una facile verifica dell'iscrizione. Ad esempio, il seguente programma stampa ogni riga la cui prima parola non appartiene a un elenco fisso di eccezioni:

awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
  _list_sz = split(serialised_exception_list, _list, ":")
  for(i = 1; i <= _list_sz; ++i) {
    exception[_list[i]]
  }
}

! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF

L'output di questo programma è

pineapple Do you like pineapple?

Come ultimo esempio, mostriamo come avvolgere il programma di punizione in uno script di shell, poiché questo illustra come uno script di shell trasmette i parametri ad uno script awk ausiliario:

#!/bin/sh

usage()
{
   cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
 Prepare your punishments for you
EOF
}

punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
  case "${OPTION}" in
    c) punishment_count="${OPTARG}";;
    s) punishment_sentence="${OPTARG}";;
    h) usage; exit 0;;
    *) usage; exit 64;;
  esac
done

awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print(sentence)
  }
  exit
}'

Variabili locali

Il linguaggio awk non supporta direttamente le variabili locali alle funzioni. È comunque facile emularli aggiungendo ulteriori argomenti alle funzioni. È tradizionale anteporre queste variabili a _ per indicare che non sono parametri effettivi.

single_quote questa tecnica con la definizione di una funzione single_quote che aggiunge virgolette singole attorno a una stringa:

# single_quote(TEXT)
#  Return a string made of TEXT surrounded by single quotes

function single_quote(text, _quote) {
  _quote = sprintf("%c", 39)
  return sprintf("%s%s%s", _quote, text, _quote);
}

L'approccio più semplice dell'uso di sprintf("'%s'", text) porta a problemi pratici perché gli script awk vengono solitamente passati come argomenti singoli citati al programma awk .

Argomenti di assegnazione

Gli argomenti di assegnazione vengono visualizzati alla fine di una awk , nella stessa area delle variabili di file, entrambe le assegnazioni -v e le assegnazioni degli argomenti devono corrispondere alla seguente espressione regolare. (presupponendo un locale POSIX)

^[[:alpha:]_][[:alnum:]_]*=

L'esempio seguente presuppone un file di file contenente quanto segue: 1 2 3 (spazio bianco separato)

$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow