Script Bash: almacena el campo awk para su uso posterior

Script Bash: almacena el campo awk para su uso posterior

Estoy escribiendo un script que lee la entrada del usuario y la divide en campos usando awk. Deseo utilizar uno de esos campos al final del script y, por lo tanto, intento almacenarlo en alguna variable, pero es en vano.

Una posible solución es guardar la entrada y procesarla awknuevamente al final, pero me preguntaba si hay alguna forma de retener la información ya procesada en alguna variable.

Por ejemplo,

read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'

# More script

echo "Your 3rd argument was $nth"

pero lo anterior no funciona. nthestá vacío al final (lo que significa que era local para awk?).

tia

Respuesta1

No estoy seguro de por qué necesita awk, pero puede agregar la -abandera readpara obtener una matriz. Suponiendo que el campo/columnas de las que estás hablando están delimitados/separados por un espacio.

read -rp "Enter args: " -a input

printf 'Your 3rd argument was %s\n' "${input[2]}"
  • Solo recuerde que las matrices bash comienzan en el índice cero.

Puede recorrer la entrada.

read -rp "Enter args: " -a input

for ((i=0; i<${#input[@]}; i++)); do
  printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done

O así

read -rp "Enter args: " -a input

for i in "${!input[@]}"; do
  printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done

Pero esto es lo que haría usando awk.

read -rp "Enter args: "

nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")

printf 'Your 3rd argument was %s\n' "$nth"

Almacenar dos campos, el segundo y el tercero en un solo nombre de variable.

read -rp "Enter args: "

nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")

printf 'The argument was %s\n' "$nth"

Si desea dividir el segundo y tercer campo en un nombre de variable diferente.

read -rp "Enter args: "

nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")

printf 'Your 2nd argument was %s\nYour 3rd argument was %s\n' "${nth#* }" "${nth% *}"
  • El "${nth#* }"y "${nth% *}"se puede guardar con variables separadas.

Una respuesta más a esta awkimpresión de todos los campos usando $0y readque vuelve a mi primera respuesta usandoread -ra

read -rp "Enter args: "

read -ra fields  < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))

Imprimir todos los campos

printf '%s\n' "${fields[@]}"
  • Mi primera publicación/respuesta a esta pregunta muestra cómo recorrer los campos de las matrices bash y cómo se indexa también.

información relacionada