4

ここで私が間違っていることを誰かに教えてもらえますか?

#!/bin/sh

if [ $# = 0 ]
then
    echo "Usage: $0 <filename>"
    exit 1
fi

sum=0
count=0

while [ $0 != 0 ]
do
        sum="$sum"+"$2"
        count="$count"+ 1

done
if [ "$count" != 0 ]
then
        avg="$sum"/"$count"
        printf "Sum= $sum \n Count= $count  \n Avg= $avg"
        exit 0
else
        printf "Sum= $sum \n Count= $count  \n Avg= undefined"
        exit 0
fi
exit 1

コードをテストしようとしたときの出力は次のとおりです。

./average

sum: =: No such file or directory
sum: 0: No such file or directory
./average: 11: count: not found
[: 18: !=0: unexpected operator
./average: 25: Syntax error: Unterminated quoted string

基本的に、次のようなファイルがあるとします。

FirstPerson 23 

SecondPerson 36

ThirdPerson 22

それを自分のプログラムに読み込んで出力できるようにしたい:

Sum = FirstPerson+SecondPerson+ThirdPerson

Count = NumberofPeople

Average = Sum/Count
4

8 に答える 8

17
 awk '{sum+=$2}END{printf "Sum=%d\nCount=%d\nAve=%.2f\n",sum,NR,sum/NR}' ave.txt

まず、Bash は整数除算を行うことができません。数学を 'bc' などのツールにパイプするか、非常に強力な awk を使用してすべてを行う必要があります。結局のところ、あなたのスクリプト全体がワンライナーに変わったのです。

サンプル入力

$猫ave.txt
ファーストパーソン 23
セカンドパーソン 36
サードパーソン 22

結果

合計=81
カウント=3
平均=27.00
于 2009-12-11T06:41:28.507 に答える
6

あなたのシェル スクリプトについてはわかりませんが、その仕事に適したツールを使用する必要があることはわかっています。そのツールがAWKです。このタスク専用に設計されており、UNIX (または Linux、Mac OS X など) を使用している場合は、インストール済みです。これはワンライナーです:

awk '{ sum+=$2; count+=1 } END {print "Sum =",sum; print "Count =",count; print "Average= ",sum/count}' test2.dat 

AWKのガイドをお読みください。UNIX の哲学は、DO NOT REINVENT THE WHEELです。適切なツールを使用してください、相棒。

幸運を、

于 2009-12-11T06:42:52.120 に答える
2

以下のコードは機能します。必要に応じて最適化できます (または awk、perl などを使用):

#!/bin/bash

if [ $# -ne 1 ]; then
        echo "Usage: \"$0\" <filename>"
        exit
fi

if [ ! -f $1 ]; then
        echo "$1 file not found."
        echo "Usage: $0 <filename>"
        exit
fi

sum=0
count=0
arq=$1

while read line
do
        num=`echo ${line#* }`
        sum=`expr $sum + $num`
        count=`expr $count + 1`
done < "$arq"

if [ "$count" != 0 ]
then
        avg=`expr $sum / $count`
        printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= \"$avg\""
        exit 0
else
        printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= undefined"
        exit 0
fi
于 2009-12-11T06:52:08.893 に答える
2

これを試して

count_ppl=0
sum=0
while read a b
do
   sum=$((sum+b))
   count_ppl=$((count_ppl+1))
done < file
echo "Sum=$sum"
echo "Count=$count_ppl"
avg=$(echo "scale=2;$sum/$count_ppl" | bc)
echo "Average=" $avg
于 2009-12-11T07:04:24.680 に答える
1
            c program for simple interest

 #include<stdio.h>
 int main(void)
  { 
    int p,r,t,s;
    printf("enter the principle value");
    scanf("%d",&p);
    printf("enter the rate or interest");
    scanf("%d",&r);
    printf("enter the time period ");
    scanf("%d",&t);
    s=p*t*r/100;
    printf("the simple interest is %d",&s);
  }     
于 2012-05-29T10:16:09.143 に答える
1

スクリプトを見ると、正しく行っていることはあまりないようです。Bash のハウツーをいくつか見て、簡単な手順に従って、期待どおりの動作をさせることをお勧めします。

  1. 変数の割り当て後にスペースをsum=入れないでください。
  2. while [ ! -f $1 ]実際に何かをするかもしれませんが、あなたが期待するものではありません
  3. read -p "Re-enter the filename and hit <Enter>: "間違いなくあなたが期待することをしません
  4. 等々
于 2009-12-11T06:34:56.533 に答える
1

そもそも、= の両側にスペースを入れてはいけません。

于 2009-12-11T06:22:28.007 に答える
1

エラー「Unterminated quoted string」は自明です

printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= "\$avg\""

する必要があります

printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= \"$avg\""
于 2009-12-11T06:26:29.153 に答える