print - manual de awk unix
comando awk para aceptar dos variables como parĂ¡metros y devolver un valor (6)
Tengo un archivo que tiene 50 filas. Cada fila se compone de tres columnas. Las primeras dos columnas son las variables y esto se pasará como parámetros para devolver el valor de la tercera columna. por ejemplo ... archivo_comandos.txt es el archivo y contiene
A B 10 C D 20 E F 30 G H 50 I J 70 ...
Tengo un script con el siguiente comando.
#!/user/bin/sh READ_FILE=/export/home/user/command_file.txt VA1=A VA2=B GET_VALUE=`awk ''/ -v var="$VA1" ''$1 ~ var'' -v var1="$VA2" ''$1 ~ var1''''/ $READ_FILE l awk ''{print $3}''` echo $GET_VALUE
Cuando llamo a este script que pasa A y B como parámetros, espero que se devuelva un valor de 10. Pero devolvió los errores. Pero si codigo el valor en el siguiente comando, funcionará.
GET_VALUE=`awk ''/A B''/ $READ_FILE lawk ''{print $3}''`
¿Alguna sugerencia? Gracias.
Creo que esto es lo que estás buscando:
#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=`awk -v var1=$VA1 -v var2=$VA2 ''$1==var1 && $2==var2 {print $3}'' command_file.txt `
echo $GET_VALUE
Fijo:
#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=`awk "/$VA1 $VA2/ "''{print $3}'' < $READ_FILE`
echo $GET_VALUE
Me disculpo por no poder determinar qué intenta hacer tu script, así que no puedo depurarlo correctamente. Creo que tal vez tienes citas anidadas o algo más está sucediendo.
Creo que el one-liner a continuación hará lo que quieras.
#!/bin/bash
grep "^$1 $2" /export/home/user/command_file.txt | awk ''{print $3}''
Editar
De acuerdo, gracias a los demás por señalar lo que intentabas hacer con las opciones -v.
Su código tiene un $ en el comando echo GET_VALUE, y usted tiene una letra l en lugar de una tubería |. Además, hay otros errores tipográficos también.
Creo que esto funciona
READ_FILE=/export/home/user/command_file.txt
awk -v var1=$1 -v var2=$2 ''$1 ~ var1 && $2 ~ var2; /^var1 var2/'' $READ_FILE | awk ''{print $3}''
pero prefiero el comando grep anterior ya que no requiere ningún esfuerzo adicional para pasar las variables de línea de comando a awk.
O quizás:
#!/bin/bash
grep "$1" test.txt | grep "$2" | awk ''{print $3}''
Si tus vars necesitan estar en cualquier orden?
Tienes que usar awk''s
paso variable awk''s
antes de que el script awk comience para evitar las citas peludas, además de solucionar otros problemas:
#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=$(awk -v var="$VA1" -v var1="$VA2" ''$1 ~ var && $2 ~ var1 {print $3}'' $READ_FILE)
echo $GET_VALUE
Sé que esta es una publicación anterior, pero awk es aún más antigua y todavía está en uso, y la gente sigue buscando las mismas respuestas. Supongo que fui un ejemplo de esto.
Decidí implementar un escenario similar pero quería variables predefinidas en el archivo de configuración. El usuario pasa el nombre parcial del archivo de configuración al script como primer parámetro.
cfg=$PWD/$1.cfg
foo=$(awk ''$1 ~ /foo/ { print $2 }'' $cfg)