Operasi rata-rata menggunakan angka dengan desimal

Saya ingin mendapatkan rata-rata angka dengan desimal. Saya menulis ini tetapi saya mendapat pesan kesalahan berikut ketika saya menulis angka desimal:

./average.sh: line 10: 1.2: syntax error: invalid arithmetic operator (error token is ".2")

operasi rata-rata saya adalah:

i=1;
sum=0;

while [[ i -lt 4 ]]
    do
            read nr
            echo "scale=2; $nr" | bc -l
            sum=$((sum+nr))
            i=$((i+1))
    done
echo "scale=2; $sum / 4" | bc -l

Bagaimana cara memodifikasinya untuk menerima input dengan desimal? Terima kasih.


person Dragos Dragomir    schedule 30.08.2019    source sumber


Jawaban (4)


Anda dapat menggunakan bc seperti yang Anda lakukan di bawah ini:

sum=$( echo $sum + $nr | bc -l )
person gmargari    schedule 30.08.2019
comment
saya=1; jumlah=0; sementara [[ i -lt 4 ]] baca nr sum=$( echo $sum + $nr | bc -l ) i=$((i+1)) selesai echo scale=2; $jumlah / 4 | bc -l hasilnya salah: input:1.1,2.2,3,3; keluaran: 1,65 - person Dragos Dragomir; 30.08.2019

Kode Anda berjalan dengan baik di sistem saya (bash 4.4.20), tetapi Anda harus mengubah baris 1 skrip Anda menjadi i=0 jika Anda ingin membaca 4 angka. Akan membantu jika Anda juga memberikan masukan bersama dengan skrip Anda.

Namun, cara yang lebih mudah adalah menggunakan datamash dengan:

datamash mean 1 # Calculate the mean of the first field

Edit

Jika Anda tidak dapat menggunakan datamash, awk akan baik untuk Anda:

awk '{sum += $0} END {print sum / NR}'
person dibery    schedule 30.08.2019
comment
untuk bilangan normal (1,2,3,4,5,...) berfungsi dengan baik, tetapi untuk bilangan desimal (1.2, 2.3, ....) tidak berfungsi. saya tidak dapat menggunakan datamash di server saya, saya perlu mencari cara lain. terima kasih - person Dragos Dragomir; 30.08.2019
comment
Sepertinya bash tidak menyukai desimal karena $((11/3)) mengembalikan 3. - person dibery; 30.08.2019
comment
@DragosDragomir Saya menambahkan solusi menggunakan awk. Ini seharusnya berhasil. - person dibery; 30.08.2019

Seperti yang dikatakan dibery, Anda perlu memodifikasi menjadi i=0 jika Anda ingin menghitung rata-rata untuk 4 angka.

Untuk membaca input dengan desimal,

read -p 'Enter: ' var
nr="$( printf '%.2f' "$var" )"

tidak terlalu elegan tetapi bisa berfungsi...

Untuk menjumlahkan, saya pikir Anda tidak bisa menjumlahkan secara langsung seperti bilangan bulat di bash, jadi mungkin coba ini

sum="$( echo "$sum+$nr" | bc)"

Untuk mencetak hasilnya, ini adalah format yang saya lebih suka gunakan

bc -l <<< "$sum/4"
person Xiaohan Peng    schedule 30.08.2019

Server saya tidak menerima utilitas "datamash" atau "bc" dan saya ingin menjumlahkan angka dengan desimal dari keyboard, bukan dari file.

Saya mencoba beberapa contoh, tetapi tidak berhasil:

i=1; sum=0; while [[ i -le 3 ]]; do read nr; awk '{sum+=$nr} END { print "media:"; sum/i}'; i=$((i+1));done
person Dragos Dragomir    schedule 03.09.2019