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 awk
nuevamente 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. nth
está 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 -a
bandera read
para 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 awk
impresión de todos los campos usando $0
y read
que 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.