Bashスクリプト:後で使用するためにawkフィールドを保存する

Bashスクリプト:後で使用するためにawkフィールドを保存する

私はユーザーの入力を読み、それを使用してフィールドに分割するスクリプトを書いていますawk。スクリプトの最後にあるフィールドの1つを使用したいので、いくつかの変数に保存しようとしましたが、役に立ちませんでした。

考えられる解決策の1つは、入力を保存して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配列はインデックス0から始まることを覚えておいてください。

入力を繰り返すことができます。

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つのフィールド(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すべてのフィールドを印刷するためのもう一つの答えは私の最初の答えに戻ります$0readread -ra

read -rp "Enter args: "

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

すべてのフィールドを印刷

printf '%s\n' "${fields[@]}"
  • この質問に対する私の最初の投稿/答えは、bash配列のフィールドを繰り返す方法とインデックス付け方法を示しました。

関連情報