簡體   English   中英

printf忽略bash中的格式

[英]printf ignoring format in bash

這是一個hackerrank問題:

計算平均值

作為簡要總結,您需要對預定義數量的整數求和,然后計算平均值並以 3 位精度打印。

我想出了以下代碼:

read number_of_ints;
sum=0

for number in $(seq 1 $number_of_ints); do 
    read number
    sum=$(($sum+$number))
done 

printf "%.3f\n" | bc -l <<< $sum/$number_of_ints
printf "%.3f\n" $(echo "$sum/$number_of_ints" | bc -l)

但是, printf "%.3f\\n" | bc -l <<< $sum/$number_of_ints printf "%.3f\\n" | bc -l <<< $sum/$number_of_ints公然忽略我的格式字符串並簡單地以 20 位精度輸出它。 同時printf "%.3f\\n" $(echo "$sum/$number_of_ints" | bc -l)正是我想要的。

我知道 20 個精度數字源於 bc -l 預加載數學庫的事實,但 printf "%.3f" 不應該仍然將其減少到三位數嗎?

問題是您沒有正確使用printf printf需要一個格式字符串,后跟盡可能多的字符串,並嘗試根據格式合理地解析它們。 您提供了一種格式,但沒有輸入,因此它可能只是將請求的換行符打印到您在其后面設置的管道中。

bc現在在 stdin 上定義了兩個流,並且忽略管道以支持 here-string。

printf "%.3f\n" | bc -l <<< $sum/$number_of_ints # two inputs

請參閱此帖子以了解類似問題。

...但你根本不需要printf https://linux.die.net/man/1/bc

bc -l <<< "scale=3;$sum/$number_of_ints"

你可以,事實上,整個代碼的事情bc

#!/usr/bin/bc
print "\nHow many numbers shall we average? "
scale=3
cnt=read()
c=cnt
while ( c ) {
  c=c-1
  print "\nEnter a number: "
  n=read()
  t=t+n
}
print "\nTotal: ", t, "\n"
print "Average: ", t/cnt, "\n"
quit

然后運行它。

$: ./bcavg
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

How many numbers shall we average? 3

Enter a number: 2

Enter a number: 7

Enter a number: 9

Total: 18
Average: 6.000

給定的代碼實際上並未將bc的輸出傳送到printf的命令行。

跨越這個差距的一種方法是使用xargs

bc -l <<<"$sum/$number_of_ints" | xargs printf '%.3f\n'

bash的解決方案,無需求助於bc

#!/bin/bash

sum=0
read n
for ((i = 0; i < n; ++i)); do read m; ((sum += m)); done

sign=1
if ((sum < 0)); then sign=-1; ((sum = -sum)); fi
m=$(( (sum * 10000 / n + 5) / 10 ))
printf '%d.%03d\n' $((m / 1000 * sign)) $((m % 1000))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM