grep
ファイルの最後の行を取得するには、パイプを使用して bash からテキスト行を読み込み、行の最初の 3 つのtail
「単語」(スペースを使用して区切りなど) を配列要素に分割します。
出力の要素を繰り返そうとすると、うまく機能し、目的の要素のfor
リストが得られます。
[] foo=$(grep select file.txt | tail -n 1)
[] echo $foo
0.47331 5.11188 13.1615 # select
[] for x in $foo; do echo $x; done
0.47331
5.11188
13.1615
#
select
それが私がやりたいことです!
ただし、最初の3つの要素を含む配列を取り出そうとするとfoo
機能しません。
[] echo "${foo[@]:0:2}"
0.47331 5.11188 13.1615 # select 4.95294 13.5177
特に奇妙なことは、行末の最後の2つの値が実際には最初select
file.txt
in(行の最初の2つの項目ではなく、2番目と3番目の項目!)を含む行なので、まったくfoo
含まれてはいけません。
同様に、単に「単語」を切り取ろうとすると、foo
奇妙な結果が出ます。
[] echo "${foo[0]}"
0.47331 5.11188 13.1615 # select
[] echo "${foo[1]}"
4.95294
(また、最後の値はあってはいけない値ですが、私の知る限りでもfoo
最初の行の2番目の項目ですselect
... file.txt
)。
何が起こっているのか、私が望む出力(配列)を取得する方法を理解する必要があります0.47331 5.11188 13.1615
。
ベストアンサー1
$foo
配列ではなく、スペースで区切られた複数の単語を含む文字列。配列にするには、次のように指定します。
foo=( $(grep 'select' file.txt | tail -n 1) )
${foo[0]}
これで、または最初の3つの要素をとして参照できます${foo[@]:0:3}
。
${foo[@]}
これには最初の3つの要素のみを抽出できるものがないため、これには最後の一致行の5つの要素がすべて含まれます。必要に応じてサイズに合わせてfoo=("${foo[@]:0:3}")
カットして使用できます。${foo[@]}
または、最初の3つの要素のみを含む配列を作成するには、awk
次のように使用できます。
foo=( $(awk '/select/ { a=$1; b=$2; c=$3 } END { print a,b,c }' file.txt) )