cat list.txt 1 apple 4 30 f 2 potato 2 40 v 3 orange 5 10 f 4 grapes 10 8 f
Guión: obtener lista ::
if [[ "$@" == *[f]* ]] ; then awkv1 = $(grep f | awk '{ print $2 $3 }') else awkv1 = $(awk '{ print $2 $4 $5 }') fi cat list.txt | $(awkv1) Tengo una variable awkv1 que almacena valor según el argumento 'f'. Pero no está funcionando . Ejecutar :: getlist f no hace nada.
Debería funcionar así :: Si se pasa 'f' en el argumento, entonces :: cat list.txt | grep f | awk '{ print $2 $3 }'
de lo contrario :: cat list.txt | awk '{ print $2 $4 $5 }'
Hay algunas correcciones que debe realizar en su secuencia de comandos:
awkv1 = $grep f use grep 'f$' . Este enfoque hace coincidir el carácter f solo en la última columna y evita que las frutas con la letra f , por ejemplo, fig , coincidan cuando la última columna termina con v.cat list.txt | $(awkv1) por echo "$awkv1" ya que la salida del comando anterior ya está almacenada en la variable $awkv1 .La versión corregida del script:
if [[ "$@" == *[f]* ]] ; then awkv1=$(grep 'f$' | awk '{ print $2, $3 }') else awkv1=$(awk '{ print $2, $4, $5 }') fi echo "$awkv1" Puede invocar este script de esta manera: cat list.txt | getlist f
¿Por qué no hacer algo como:
Archivo: getlist
#!/bin/sh if [ "$1" = "f" ]; then awk '$5=="f"{print $2,$3}' list.txt else awk '{print $2,$4,$5}' list.txt fiSi este archivo es ejecutable, puede llamarlo así:
$ ./getlist f apple 4 orange 5 grapes 10 $ ./getlist apple 30 f potato 40 v orange 10 f grapes 8 f $O si desea especificar el valor de búsqueda en la línea de comando:
#!/bin/sh if [ "$1" ]; then awk -vt="$1" '$5==t{print $2,$3}' list.txt else awk '{print $2,$4,$5}' list.txt fi De esta manera, puede enumerar los campos etiquetados como f o v :
$ ./getlist apple 30 f potato 40 v orange 10 f grapes 8 f $ ./getlist f apple 4 orange 5 grapes 10 $ ./getlist v potato 2 $Almacenar una línea de comando parcial en una variable de cadena es propenso a errores, es mejor usar matrices bash.
Puedes modificar tu script de esta manera:
#!/bin/bash # store awk command line in an array if [[ "$*" == *f* ]]; then awkcmd=(awk '/f/{ print $2, $3 }') else awkcmd=(awk '{ print $2, $4, $5 }') fi # execute your awk command "${awkcmd[@]}" list.txt