Buscar..


Asignación de variable de línea de comando

Para asignar variables desde la línea de comandos, se puede usar -v :

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

Tenga en cuenta que no hay espacios alrededor del signo igual.

Esto permite utilizar variables de shell:

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

Además, esto permite establecer variables integradas que controlan awk :

Vea un ejemplo con FS (separador de 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 (separador de campo de salida):

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

Pasando parámetros a un programa usando la opción -v

La opción -v seguida de una asignación de la forma variable = valor puede usarse para pasar parámetros a un programa awk . Esto se ilustra en el siguiente programa de castigo , cuyo trabajo es escribir contar la oración "No hablaré en clase" en la salida estándar. El siguiente ejemplo usa el valor 100, que es muy popular entre los maestros:

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

Es posible pasar múltiples parámetros con el uso repetido de la bandera -v :

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

No hay soporte incorporado para los parámetros de matriz o lista, estos deben manejarse manualmente. Un enfoque clásico para pasar un parámetro de lista es concatenar la lista usando un delimitador, las opciones populares son : | o , . La función de división permite recuperar la lista como una matriz 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
}'

La salida de este programa awk es

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

A veces es más conveniente recuperar los elementos de la lista como claves de una matriz awk , ya que esto permite una fácil verificación de la membresía. Por ejemplo, el siguiente programa imprime cada línea cuya primera palabra no pertenece a una lista fija de excepciones:

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

La salida de este programa es

pineapple Do you like pineapple?

Como ejemplo final, mostramos cómo envolver el programa de castigo en un script de shell, ya que esto ilustra cómo un script de shell transmite parámetros a un script awk auxiliar:

#!/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
}'

Variables locales

El lenguaje awk no admite directamente variables locales a funciones. Sin embargo, es fácil emularlos agregando argumentos adicionales a las funciones. Es tradicional prefijar estas variables con una _ para indicar que no son parámetros reales.

Ilustramos esta técnica con la definición de una función single_quote que agrega comillas simples alrededor de una cadena:

# 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);
}

El enfoque más simple de usar sprintf("'%s'", text) conduce a problemas prácticos porque los scripts awk generalmente se pasan como argumentos entre comillas simples al programa awk .

Argumentos de Asignación

Los argumentos de asignación aparecen al final de una invocación awk , en la misma área que las variables de archivo, tanto las asignaciones -v asignaciones de argumentos deben coincidir con la siguiente expresión regular. (Suponiendo un local POSIX)

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

El siguiente ejemplo supone un archivo de file contiene lo siguiente: 1 2 3 (espacio en blanco separado)

$ 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow