การดำเนินการเฉลี่ยโดยใช้ตัวเลขที่มีทศนิยม

ฉันต้องการหาค่าเฉลี่ยของตัวเลขที่มีทศนิยม ฉันเขียนสิ่งนี้แต่ได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้เมื่อฉันเขียนเลขทศนิยม:

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

การดำเนินการโดยเฉลี่ยของฉันคือ:

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

ฉันจะแก้ไขเพื่อรับอินพุตที่เป็นทศนิยมได้อย่างไร ขอบคุณ.


person Dragos Dragomir    schedule 30.08.2019    source แหล่งที่มา


คำตอบ (4)


คุณสามารถใช้ bc ดังที่คุณทำด้านล่าง:

sum=$( echo $sum + $nr | bc -l )
person gmargari    schedule 30.08.2019
comment
ฉัน=1; ผลรวม=0; ในขณะที่ [[ i -lt 4 ]] อ่าน nr sum=$( echo $sum + $nr | bc -l ) i=$((i+1)) เสร็จแล้ว echo scale=2; $ผลรวม / 4 | bc -l ผลลัพธ์ไม่ถูกต้อง: input:1.1,2.2,3,3; เอาท์พุท:1.65 - person Dragos Dragomir; 30.08.2019

รหัสของคุณทำงานได้ดีบนระบบของฉัน (bash 4.4.20) แต่คุณควรแก้ไขบรรทัดที่ 1 ของสคริปต์ของคุณเป็น i=0 หากคุณต้องการอ่านตัวเลข 4 ตัว มันจะช่วยได้ถ้าคุณให้ข้อมูลของคุณพร้อมกับสคริปต์ของคุณด้วย

อย่างไรก็ตาม วิธีที่ง่ายกว่าคือการใช้ datamash โดย:

datamash mean 1 # Calculate the mean of the first field

แก้ไข

หากคุณไม่สามารถใช้ datamash ได้ awk ก็จะดีสำหรับคุณ:

awk '{sum += $0} END {print sum / NR}'
person dibery    schedule 30.08.2019
comment
สำหรับตัวเลขปกติ (1,2,3,4,5,...) มันใช้ได้ แต่สำหรับตัวเลขที่มีทศนิยม (1.2, 2.3, ....) มันไม่ทำงาน ฉันไม่สามารถใช้ datamash บนเซิร์ฟเวอร์ของฉันได้ ฉันต้องหาวิธีอื่น ขอบคุณ - person Dragos Dragomir; 30.08.2019
comment
ดูเหมือนว่า bash จะไม่ชอบทศนิยมเนื่องจาก $((11/3)) ส่งกลับ 3 - person dibery; 30.08.2019
comment
@DragosDragomir ฉันได้เพิ่มวิธีแก้ปัญหาโดยใช้ awk มันควรจะทำงาน - person dibery; 30.08.2019

ดังที่ dibery บอก คุณต้องแก้ไขเป็น i=0 หากคุณต้องการคำนวณค่าเฉลี่ยของตัวเลข 4 ตัว

สำหรับการอ่านอินพุตที่มีทศนิยม

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

ไม่หรูหรามากแต่ก็ใช้งานได้...

สำหรับการสรุป ฉันคิดว่าคุณไม่สามารถรวมโดยตรงแบบจำนวนเต็มใน bash ได้ ดังนั้นอาจลองทำเช่นนี้

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

สำหรับการพิมพ์ผลลัพธ์ นี่คือรูปแบบที่ฉันชอบใช้

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

เซิร์ฟเวอร์ของฉันไม่ยอมรับยูทิลิตี้ "datamash" หรือ "bc" และฉันต้องการรวมตัวเลขด้วยทศนิยมจากแป้นพิมพ์ ไม่ใช่จากไฟล์

ฉันลองตัวอย่างแล้ว แต่มันไม่ทำงาน:

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