Script Bash: Armazene o campo awk para uso posterior

Script Bash: Armazene o campo awk para uso posterior

Estou escrevendo um script que lê a entrada do usuário e a divide em campos usando awk. Desejo usar um desses campos no final do script e, portanto, estou tentando armazená-lo em alguma variável, mas em vão.

Uma solução possível é salvar a entrada e processá-la awknovamente no final, mas gostaria de saber se existe alguma maneira de reter as informações já processadas em alguma variável.

por exemplo,

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

# More script

echo "Your 3rd argument was $nth"

mas acima não funciona. nthestá vazio no final (o que significa que era local para awk?).

TIA

Responder1

Não tenho certeza sobre por que você precisa do awk, mas você pode adicionar o -asinalizador para readobter um array. Supondo que o campo/colunas de que você está falando sejam delimitados/separados por um espaço.

read -rp "Enter args: " -a input

printf 'Your 3rd argument was %s\n' "${input[2]}"
  • Apenas lembre-se de que os arrays bash começam no índice zero.

Você pode percorrer a 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

Ou assim

read -rp "Enter args: " -a input

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

Mas aqui está o que eu faria usando o awk.

read -rp "Enter args: "

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

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

Armazenando dois campos, 2º e 3º em apenas um nome de variável.

read -rp "Enter args: "

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

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

Se você deseja dividir o segundo e o terceiro campo em um nome de variável 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% *}"
  • O "${nth#* }"e "${nth% *}"pode ser salvo com variáveis ​​separadas.

Mais uma resposta para esta awkimpressão de todos os campos usando $0e readque remete à minha primeira resposta usandoread -ra

read -rp "Enter args: "

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

Imprimir todos os campos

printf '%s\n' "${fields[@]}"
  • Minha primeira postagem/resposta a esta pergunta mostra como percorrer os campos dos arrays bash e como eles também são indexados.

informação relacionada