awk con declaraciones if

Estoy intentando imprimir desde un file usando awk, pero mi salida está vacía. Aquí está mi código hasta ahora

accountNum=$1 while read -r LINE || [[ -n $LINE ]] ; do awk -F',' '{ if($1==accountNum) { print $3.$2 } }' Accounts done < Accounts 

También he intentado esto:

 accountNum=$1 while read -r LINE || [[ -n $LINE ]] ; do echo $LINE | awk -F',' '{ if($1==accountNum) { print $3.$2 } }' done < Accounts 

El file de input es:

 1,Doe,John 2,Rooney,Wayne 3,Smith,Will 4,Crow,Russel 5,Cruise,Tom 

El resultado esperado cuando ejecuto el file es

 $./file.sh 3 Will Smith 

Pero recibo lo siguiente

 $./file.sh 3 $ 

Eso no es nada se está imprimiendo. Conozco la solución con corte, pero quiero usar awk.

Debería usar la opción -v de awk :

 awk -F',' -v accNum="$1" '$1 == accNum {print $3,$2}' 

Con $1 en comillas dobles, el shell manejará todo su carácter especial (si tiene) para usted.

Su script ya prácticamente hace el trabajo sin ningún tipo de awk :

 while IFS=, read -r num last first do [ $((num==accountNum)) -eq 1 ] && printf '%s.%s\n' "$first" "$last" done < Accounts 

No estoy sugiriendo que esta sea una solución mejor o más eficiente que usar awk solo, pero si quieres el while...read loop, esto ciertamente supera los processs awk por cada línea. Solo un FYI, supongo.

Tienes:

 accountNum=$1 awk -F',' '{ if($1==accountNum) { print $3.$2 } }' Accounts 

¿Cómo funciona la variable de shell accountNum en awk ? No: debe proporcionar su valor para awk explícitamente. Puedes usar:

 awk -F',' '{ if($1=='"$accountNum"') { print $3.$2 } }' Accounts 

que deja las comillas simples y hace que el intérprete sustituya el valor de su variable en el command awk , luego vuelve a ingresar las comillas simples para el rest de la cadena de commands.

Una secuencia de commands mejor o al less más idiomática sería:

 #!/bin/sh accountNum=$1 awk -F, '$1 == "'"$accountNum"'" { print $3,$2 }' Accounts 

que trata con numbers de count no numéricos (citando la variable sustituida), utiliza un bloque de patrón en lugar de un if explícito (el {} bloque se ejecutará si la testing es verdadera antes), e imprime un espacio entre los nombres como lo desea (debido a , ). Si prefiere usarlo explícitamente, mueva la testing dentro de su statement if existente.

Dependiendo de su objective real, awk puede no ser la mejor opción para lo que está haciendo. Lo anterior aún falla si el $1 del script tiene comillas. El bucle de shell que tenía no estaba haciendo nada útil, aunque habría repetido la salida muchas veces.

 #!/bin/bash awk -va="$1" -F ',' '$1 == a { print $3, $2 }' Accounts 

Con -va="$1" configuramos la variable awk a con el valor del primer argumento de línea de command del guión, luego especificamos que la input está separada por comas con -F ',' . Si la primera columna es igual al valor de a , imprima las otras dos columnas en order inverso.

No obtienes nada en tu salida cuando accountNum la primera columna con la variable accountNum , que está desarmada.

Si hubiera habido una input cuya primera columna tenía 0 (cero) en ella, esa input se habría impreso. Esto se debe a que el valor de las variables no establecidas en awk evalúa como cero.