18.7.6. Выполнение суммирования
18.7.6. Выполнение суммирования
Довольно часто приходится сталкиваться с задачей считывания информации из файла и выполнения суммирования по определенным столбцам, содержащим числа. Предположим, в файле total.txt находятся данные о продажах отделами stat и gift..
$ pg total.txt
STAT 3444 GIFT 233 GIFT 252 GIFT 932 STAT 212 STAT 923 GIFT 129
Задача состоит в подсчете общей суммы всех записей отдела gift. Чтобы сохранить общие значения сумм, применим оператор expr. Как показано в следующем операторе expr, переменным loop и total первоначально вне цикла присваивается значение ноль. Когда сценарий выполняет цикл, значение переменной items добавляется к значению переменной total. В первую итерацию цикла входит только первый пункт, но в дальнейшем к накапливающимся значениям переменной total добавляются значения переменной items.
Следующий оператор expr увеличивает значение счетчика.
LOOP=0
TOTAL=0
while…
TOTAL=`expr $TOTAL + $ITEMS`
ITEMS=`expr $ITEMS + 1`
done
Очень распространенной является такая ошибка: при работе с оператором expr забывают сначала инициализировать переменную.
LOOP=0
TOTAL=0
Если переменная не инициализирована, на экране появится сообщение об ошибочном применении оператора expr. При необходимости можно инициализировать переменную в цикле:
TOTAL=`expr ${TOTAL:=0} + ${ITEMS}`
В вышеприведенном примере переменной total присваивается значение нуль, если эта переменная не имеет значения. Чаще распространен первый вариант инициализации переменных с помощью оператора expr. Не забывайте выводить на экран конечное общее значение, полученное в результате выполнения цикла.
Рассмотрим следующий сценарий.
$ pg total
#!/bin/sh
#общая сумма
#инициализация переменных
LOOP=0
TOTAL=0
COUNT=0
echo "items Dept"
echo " "
while read DEPT ITEMS do
# сохраните результаты подсчета при просмотре общих записей
COUNT=`expr $COUNT + 1`
if [ "$DEPT"="GIFT" ]; then
# сохраните выполнение суммирования TOTAL=`expr $TOTAL + $ITEMS` ITEMS=`expr $ITEMS + 1`
echo -e "$ITEMS $DEPT"
fi
#echo $DEPT $ITEMS done < total.txt
echo $TOTAL
echo "There were $COUNT entries altogether in the file"
При выполнении сценария получим:
$ total
Items Dept 234 GIFT 253 GIFT 933 GIFT 130 GIFT ====== ====== 1546There were 7 entries altogether in the file