ファイルの数値平均を計算するシェルスクリプトを作成していますが、何らかの理由でbashは私の数値を合計しません。
sum = 'expr $ sum + $ num'の形式を指定するいくつかの方法を試しましたが、引き続きエラーが発生します。
while read line
do
sum=0
count=0
average=0
median=0
#read each line, sort it and put it into tempRows file
echo "$line" >> $tempRow
sort $tempRow
#add each number to the sum for avg calculation
for i in $tempRow
do
num=$i
count=`expr $count + 1`
echo "count: $count"
sum=`expr $sum + $num`
echo "sum: $sum"
done
#perform and print average calc at the end of each line
average=`expr $sum / $count`
echo -e "$average\t"
rm -f $tempRow
done < $tempFile
現在、このコードは終了する前に次の出力を提供します。
count: 1
expr:non-numeric argument
sum:
expr:syntax error
後で中央値を計算するためにtempRowに追加する前に、各行をソートします。サンプルファイルには複数の行と整数の列が含まれており、各行の平均値と中央値を印刷します。
答え1
ランニングbash -x myscript
。これにより、実行追跡が提供され、問題が明確になります。
あなたの主な質問は
for i in $tempRow
この変数$tempRow
にはファイル名が含まれています。ファイル名にスペースやワイルドカードが含まれていないと仮定すると、$tempRow
ファイル名という単語を含むリストに展開されます。したがって、for ループ本体は一度実行され、i
ファイル名に設定されます。
ファイルの行を繰り返すようです。これに使用されますwhile read
。具体的には、while IFS= read -r i; do …
。
いくつかの追加のヒント:
- 理由がわからない限り、常に変数拡張を二重引用符で囲む必要があります。。
- を使用しないでください
expr
。今は21世紀で、すべてのシェルには演算機能が組み込まれています。count=$((count + 1))
など。 - 外部ループを実行するたびにソートするロジックは奇妙ですが、何を計算したいのかを理解しようとしました。