2017-08-29 36 views
1

我有一個我想在BASH中執行操作的數字列表(例如,正弦,sqrt等)。目前,我遍歷使用BC和粘性上的空間" ",這似乎有點笨重號碼的載體:在不使用循環的情況下使用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 

我在想,如果有辦法做到這一點不使用循環和" "一個更合適的方法標記?

+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[@]}" 

或者,也可以在卑詩省完全寫出來,以避免產卵子shell的每一行:

#!/usr/bin/bc 

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

如果你把它寫成一個名爲getsquares的腳本,你可以用

a=($(./getsquares)) 

或,兩全其美(BC的單個實例,嵌入在bash腳本)的:

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

相反的是調用bc每個號碼,則可以使用一個單一的AWK這樣的:

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 
相關問題