2017-08-29 4 views
1

私はBASHで演算を実行する数値のリストを持っています(例えば、sine、sqrtなど)。少し不格好思わスペース" "、上のBCとタックを使用して数値のベクトルを超えるモーメントIループでは:すっきりループを使用せずにこれを行う方法と" "があった場合ループを使用せずにbcで数値のリストを操作する

x=`seq 1 2.5 30` # generate a list of numbers 
for i in $x ; do 
    a=${a}`echo "sqrt($i)" | bc`" " 
done # a is output vector 

私は思っていましたタグ付け?

番号ごと bcを呼び出し、あなたはこのような単一のawkを使用することができるということではなく
+1

これはあなたの質問に答えませんが、私は真剣にPerlやPythonのような別の言語の使用を検討します。 – cdarke

+0

通常はそうですが、ncgenを使用して素早く簡単におもちゃnetcdfファイルを作成したい –

答えて

2

あなたは配列を作成するのではなく、スペースを含む文字列を作成します。あなたが代わりに実際の配列を使用することもできます。

また

1 
1.8 
2.4 
2.9 
3.3 
3.6 
4.0 
4.3 
4.5 
4.8 
5.0 
5.3 

その結果

for x in $(seq 1 2.5 30); do 
    a+=($(bc <<< "sqrt($x)")) 
done 

printf '%s\n' "${a[@]}" 

を、あなたは、各行のサブシェルを産卵避けるために、紀元前に完全にそれを書くことができます。

#!/usr/bin/bc 

for (x = 1; x <= 30; x += 2.5) { 
    sqrt(x) 
} 
quit 

の場合あなたはそれをgetsquaresというスクリプトに埋め込み、

で配列を取得できます両方の世界(bashスクリプトに埋め込まれたBCの単一インスタンス)の

又は、ベスト:

a=($(bc <<< 'for (x = 1; x <= 30; x += 2.5) sqrt(x)')) 
1

:配列の使用中の出力を格納するために

awk -v b=1 -v e=30 'BEGIN{for (i=b; i<=e; i+=2.5) printf "%.1f\n", sqrt(i)}' 
1.0 
1.9 
2.4 
2.9 
3.3 
3.7 
4.0 
4.3 
4.6 
4.8 
5.1 
5.3 

を:

arr=($(awk -v b=1 -v e=30 'BEGIN{for (i=b; i<=e; i+=2.5) printf "%.1f\n", sqrt(i)}')) 

その後、使用して出力を印刷:

printf '%s\n' "${arr[@]}" 
1

配列にコマンドの出力を隠しておくためにはbash、特にmapfile使用:

$ mapfile -t nums < <(seq 1 2.5 30) 

$ mapfile -t sqrts < <(printf "sqrt(%f)\n" "${nums[@]}" | bc -l) 

$ printf "%s\n" "${sqrts[@]}" 
1 
1.87082869338697069279 
2.44948974278317809819 
2.91547594742265023543 
3.31662479035539984911 
3.67423461417476714729 
4.00000000000000000000 
4.30116263352131338586 
4.58257569495584000658 
4.84767985741632901407 
5.09901951359278483002 
5.33853912601565560540 
関連する問題