1

入力数値のグループの最大値と平均値を計算して表示するのに助けが必要です。

プログラムは、それぞれ最大 3 桁までの数字のグループを受け入れる必要があります。

たとえば、246、321、16、10、12345、4、274、および 0 を入力すると、最大は 321、平均は 145 になり、12345 が無効であることを示すエラー メッセージが表示されます。

bash でソートする方法はありますか? 申し訳ありませんが、私はこの低レベルの開発者ではありません。どんな助けも素晴らしいです:)

4

3 に答える 3

1

私はあなたが解決策を求めているようですBashが、あなたがそれにタグを付けたので、Unix私は純粋なawk解決策を提案します(awkそのような問題にはちょうど理想的です):

awk '
  {
    if(length($1) <= 3 && $1 ~ /^[0-9]+$/) {
      if($1 > MAX) {MAX = $1}
      SUM+=$1
      N++
      print $1, N, SUM
    } else {
      print "Illegal Input " $1
    }
  }
  END {
    print "Average: " SUM / N
    print "Max: " MAX
  }
' < <(echo -e "246\n321\n16\n10\n12345\n4\n274\n0")

プリント

246 1 246
321 2 567
16 3 583
10 4 593
Illegal Input 12345
4 5 597
274 6 871
0 7 871
Average: 124.429
Max: 321

しかし、なぜ上記の入力が平均で145になるのか理解できません。

于 2012-08-20T14:00:24.980 に答える
0

次のパイプcoreutilsオプションbc:

echo 246 321 16 10 12345 4 274 0           \
| grep -o '\b[0-9]{1,3}\b'                 \
| tee >(sort -n | tail -n1 > /tmp/max)     \
| tr '\n' ' '                              \
| tee >(sed 's/ $//; s/ \+/+/g' > /tmp/add) \
      >(wc -w > /tmp/len) > /dev/null

printf "Max: %d, Min: %.2f\n" \
  $(< /tmp/max)               \
  $((echo -n '('; cat /tmp/add; echo -n ')/'; cat /tmp/len) | bc -l)

出力:

Max: 321, Min: 124.43
  • grep数値形式の制約を保証します。
  • sortチェプナーが示唆するように、最大​​を見つけます
  • sedwc合計と除数を生成します。

これにより 3 つの一時ファイルが生成されることに注意して/tmp/{max,add,len}くださいmktemp:

rm /tmp/{max,add,len}

編集

無効な入力について知りたい場合は、これをパイプの前に挿入します。

tee >(tr ' ' '\n'            \
      | grep -v '\b.{1,3}\b' \
      | sed 's/^/Invalid input: /' > /tmp/err)

cat /tmp/errの後に実行しprintfます。

于 2012-08-20T14:40:23.540 に答える
0
tmpfile=`mktemp`
while read line ; do
  if [[ $line =~ ^[0-9]{1,3}$ ]] ; then 
    # valid input
    if [ $line == "0" ] ; then
      break
    fi  
    echo $line >> $tmpfile
  else 
    echo "ERROR: invalid input '$line'"
  fi  
done
awk ' { tot += $1; if (max < $1) max = $1; } \
  END { print tot / NR; print max; } ' $tmpfile
rm $tmpfile 
于 2012-08-20T13:38:19.340 に答える