2012-03-04 3 views
9

Estoy escribí un script de shell que incluye un par de líneas en awk

la línea awk es así:

cat input.csv | awk -F, '$1~/$1/ {print "is good"}' 

la primera $1 es la primera columna de la csv de entrada, la segunda $1 se supone que es la primera entrada de línea de comandos del script de shell

traté de poner un \ delante de la segunda $, pero parece ser no funciona.

¿Alguien puede ayudar?

Respuesta

5
cat input.csv | awk -F, '$1~/'"$1"'/ {print "is good"}' 

que necesita para cerrar la cadena ', inserte la cáscara $1 (dentro " por si hay caracteres especiales), vuelva a abrir la cadena '.

Y es posible que desee comprobar si el $1 del shell contiene / caracteres que alterarán la expresión regular.

Y como lo indicó @Ignacio Vazquez-Abrams, no necesita conectar la salida de cat a awk, solo puede obtener awk para leer el archivo directamente. Es decir:

cat input.csv | awk ... 

se puede simplificar a:

awk ... < input.csv 
+1

Eso realmente no le dice a awk que lea el archivo. Le dice al shell que lo alimente directamente al stdin de awk en lugar de usar cat. –

+0

@Ignacio Vazquez-Abrams: Lo sé, pero no quería meterme en demasiadas complicaciones. –

+0

@ IgnacioVazquez-Abrams La redirección no "lo alimenta directamente al stdin de awk". El archivo * se convierte en * std de awk. El uso inútil de cat alimenta el contenido del archivo a awdin's stdin, y esa inutilidad de E/S es la razón por la cual UUOC es ineficiente. –

4

Una variable está muy bien también.

awk -F, -v needle="$1" '$1 ~ needle {print "is good"}' < input.csv 
+0

Buena idea sobre la variable adicional. Supongo que eso elimina cualquier problema en el que '$ 1' pueda contener caracteres especiales, ¿o sí? –

+5

Cada personaje es especial a su manera. –

1

cat o una redirección no es necesaria. Aquí hay una tercera variante que usa barra invertida:

awk -F, "\$1~/$1/ {print \"is good\"}" input.csv 
Cuestiones relacionadas