Я пишу скрипт, который считывает вводимые пользователем данные и делит их на поля, используя 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 и как они индексируются.