2010-02-09 13 views
17

Estoy aprendiendo awk y tengo problemas para pasar una variable al script Y usarlo como parte de un patrón de búsqueda de expresiones regulares.Pasar variable a awk y usar eso en una expresión regular

El ejemplo está ideado pero muestra mi análisis.

Mis datos es el siguiente:

Eddy  Smith  0600000000 1981-07-16 Los Angeles 
Frank  Smith  0611111111 1947-04-29 Chicago   
Victoria McSmith  0687654321 1982-12-16 Los Angeles 
Barbara  Smithy  0633244321 1984-06-24 Boston    
Jane  McSmithy 0612345678 1947-01-15 Chicago    
Grace  Jones  0622222222 1985-10-07 Los Angeles 
Bernard  Jones  0647658763 1988-01-01 New York   
George  Jonesy  0623428948 1983-01-01 New York   
Indiana  McJones  0698732298 1952-01-01 Miami    
Philip  McJonesy 0644238523 1954-01-01 Miami 

Quiero un script awk que puedo pasar una variable y luego tener la secuencia de comandos awk hacer una expresión regular para la variable. Tengo este script ahora llamado "003_search_persons.awk".

#this awk script looks for a certain name, returns firstName, lastName and City 

#print column headers 
BEGIN { 
    printf "firstName lastName City\n"; 
} 

#look for the name, print firstName, lastName and City 
$2 ~ name { 
    printf $1 " " $2 " " $5 " " $6; 
    printf "\n"; 
} 

que llamo el script como el siguiente:

awk -f 003_search_persons.awk name=Smith 003_persons.txt 

devuelve el siguiente, lo cual es bueno.

firstName lastName City 
Eddy Smith Los Angeles 
Frank Smith Chicago 
Victoria McSmith Los Angeles 
Barbara Smithy Boston 
Jane McSmithy Chicago 

Pero ahora quiero buscar un cierto prefijo "Mc". Podría, por supuesto, codificarlo, pero quiero un script awk que sea flexible. Escribí lo siguiente en 003_search_persons_prefix.awk.

#this awk script looks for a certain prefix to a name, returns firstName, lastName and City 

#print column headers 
BEGIN { 
    printf "firstName lastName City\n"; 
} 

#look for the prefix, print firstName, lastName and City 
/^prefix/{ 
    printf $1 " " $2 " " $5 " " $6; 
    printf "\n"; 
} 

que llamo el script como el siguiente:

awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt 

Pero ahora se encuentra ningún registro.

El problema es el patrón de búsqueda "/^prefijo /". Sé que puedo reemplazar ese patrón de búsqueda por uno no regex, como en el primer script, pero supongamos que quiero hacerlo con una expresión regular, porque necesito que el prefijo realmente esté al comienzo del campo Apellido, ya que debería ser, siendo un prefijo y todo ;-)

¿Cómo puedo hacer esto?

+2

de limpieza en el pasillo 5: deshacerse de todas las declaraciones nulos (trailing punto y coma), el cambio printf "\ n "simplemente imprimir" ", y cambiar printf $ 1" "$ 2 etc. para simplemente imprimir $ 1, $ 2, etc. –

Respuesta

16

puede probar esta salida

BEGIN{ 
printf "firstName lastName City\n"; 
split(ARGV[1], n,"=") 
prefix=n[2] 
pat="^"prefix 
} 
$0 ~ pat{ 
    print "found: "$0 
} 

$ awk -f test.awk name=Jane file 
firstName lastName City 
found: Jane  McSmithy 0612345678 1947-01-15 Chicago 

Mira el awk documentation por más. (Y leerlo de principio a fin!)

+0

Gracias, voy a probar esto en breve. –

+4

Ninguna de estas divisiones es necesaria porque usar name = Jane en la lista arg crea una variable llamada "nombre" con el valor "Jane" por lo que podría haber dicho 'pat ="^"name' en un FNR == 1 sección. Sin embargo, es preferible establecer variables con "-v", por lo que no tiene que trabajar con variables que no se hayan completado en la sección BEGIN. –

0

¿Se requiere específicamente un aviso? Estoy seguro de que es bastante posible en awk, pero no lo sé, si solo necesitas hacer el trabajo, entonces puedes intentarlo. no estoy seguro exactamente de lo que es ese delimitador.

cut -d " " -f1-2,5 file | egrep '^regex' 
+0

awk es una herramienta eléctrica que hace el trabajo de corte y grep combinados. así que sí, es posible con awk. Ver http://www.gnu.org/manual/gawk/html_node/Computed-Regexps.html#Computed-Regexps – ghostdog74

+0

Estoy interesado en la solución awk para esto. Pero gracias. –

1

usted debería ser capaz de utilizar su guión original sin cambios - $2 ~ name ya está haciendo una búsqueda de expresiones regulares por lo que si se llama a la secuencia de comandos con name=^Mc luego volverá nombres que comienzan con "Mc" . En realidad, este no es un buen ejemplo, ya que Mc solo aparece al comienzo del nombre; si usa name=^Smith, encontrará los Smith pero no los McSmiths.

+0

Pero luego tendría que pasar una expresión regular (^ Smith) como el parámetro, y personalmente creo que es un poco feo. –

5

Cambiar la secuencia de comandos para:

BEGIN { 
    print "firstName", "lastName", "City" 
    ORS = "\n\n" 
} 

$0 ~ "^" prefix { 
    print $1, $2, $5, $6 
} 

y lo llaman como

awk -v prefix="Mc" -f 003_search_persons.awk 003_persons.txt 
+0

¡Hermoso! El truco de '$ 0 ~"^"' es lo que estaba buscando. – fedorqui

Cuestiones relacionadas