2010-12-23 16 views
8

He intentado esto desde mi script de shell y el resultado no fue el destinadouso variable de fiesta desde dentro AWK

REF=SEARCH_TEXT 
echo "some text" | awk '/$REF/{print $2}' 

Se No se encontró $ REF incluso con el texto que contenía

Suggest!

+0

posible duplicado de [pasar una variable de script de shell en un comando awk] (http://superuser.com/questions/203819/passing-a-shell-script-variable-into-an-awk-command) – ephemient

Respuesta

15

Usted cuestión está redactada realmente pobres ...

De todos modos, creo que usted quiere esto:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/{print \$2}" 

Nota del escape de $2 y las comillas dobles.

o esto:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/"'{print $2}' 

Nota el uso juicioso de comillas dobles e individuales y hay escape de $2.

usted tiene que utilizar el desarrollo del forro, ya que de lo contrario se abarcaría la exportación de una variable de shell y el uso del ambiente con awk - que es exageración en esta situación:

export REF=SEARCH_TEXT 
echo "some text" | awk '{if (match($0, ENVIRON["REF"])) print $2}' 

creo AWK no admite variables en /.../ guardias. Por favor corrígeme si me equivoco.

+0

$ 2 funciona bien con y sin el \. La pregunta es sobre $ REF, que no es gastado por awk. thx – vehomzzz

+0

@Fritschy: Para muchas personas que usan Internet, el inglés no es su primer idioma; algunas personas usan Google para traducir su pregunta. ;-) –

+0

vehomzzz, al usar comillas dobles - que fue lo que sugerí en roder para permitir que el shell expanda '$ REF' correctamente, tienes que escapar' $ 2' - para evitar que el shell lo expanda. –

36

en lugar de citar juegos en la cáscara, utilice la opción -v para pasar la variable shell como una variable awk:

awk -v ref="$REF" 'match($0, ref) {print $2}' 

Si $REF es sólo texto y no una expresión regular, utilice la función index() vez de match().

+0

Interesante, Glenn. Gracias por compartir. –

+5

+1 - '-v' es la forma correcta de hacerlo. –

+0

¿Podría por favor aconsejarme cómo hacer esto en mi caso? izquierda = 1; derecha = 4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | cola -n 1 | awk '{print substr ($ 0,1,4)}' funciona y genera GTTG, pero la versión con variables no, gracias: left = 1; derecha = 4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | cola -n 1 | awk -v l = "$ left" r = "$ right" '{print substr ($ 0, l, r)}' awk: cmd. línea: 1: fatal: no se puede abrir el archivo '{print substr ($ 0, l, r)} 'para leer – Perlnika

1

En gawk, tiene la matriz ENVIRON, p. Ej. awk 'END{print ENVIRON["REF"]}' /dev/null imprimirá su variable si ha export editado desde el shell para subprocesos.

+0

Esto también funciona (y la variable no tiene que ser exportada si 'REF = value awk' ... ''). Pero recomendaría el interruptor '-v' como la solución general. – dubiousjim

Cuestiones relacionadas