Скрипт Bash: сохранение поля awk для дальнейшего использования

Скрипт Bash: сохранение поля awk для дальнейшего использования

Я пишу скрипт, который считывает вводимые пользователем данные и делит их на поля, используя awk. Я хочу использовать одно из этих полей в конце скрипта и поэтому пытаюсь сохранить его в какой-то переменной, но тщетно.

Одним из возможных решений является сохранение входных данных и awkповторная их обработка в конце, но мне было интересно, есть ли способ сохранить уже обработанную информацию в какой-то переменной.

например,

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

# More script

echo "Your 3rd argument was $nth"

но выше не работает. nthпусто в конце (что означает, что он был локальным для awk?).

ТИА

решение1

Не уверен, зачем вам нужен awk, но вы можете добавить флаг -a, readчтобы получить массив. Предполагая, что поле/столбцы, о которых вы говорите, разделены пробелом.

read -rp "Enter args: " -a input

printf 'Your 3rd argument was %s\n' "${input[2]}"
  • Просто помните, что массивы bash начинаются с нулевого индекса.

Вы можете перебрать входные данные.

read -rp "Enter args: " -a input

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

Или вот так

read -rp "Enter args: " -a input

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

Но вот что я бы сделал, используя awk.

read -rp "Enter args: "

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

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

Сохранение двух полей, 2-го и 3-го, всего в одном имени переменной.

read -rp "Enter args: "

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

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

Если вы хотите разделить 2-е и 3-е поле на другое имя переменной.

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% *}"
  • И "${nth#* }"можно "${nth% *}"сохранить с помощью отдельных переменных.

Еще один ответ на эту awkраспечатку всех полей, использующих $0и readкоторый возвращает нас к моему первому ответу, использующемуread -ra

read -rp "Enter args: "

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

Распечатать все поля

printf '%s\n' "${fields[@]}"
  • Мой первый пост/ответ на этот вопрос показывает, как перебирать поля массивов bash и как они индексируются.

Связанный контент