суммирование содержимого поля - bash - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть файл, который содержит данные в следующем формате:

Поле 1 Поле 2 Длительность звонка

Моя задача - суммировать поля nCalls и duration. Код, который я написал до сих пор, выглядит следующим образом:

cat ${file} |\
while read n1 n2 nCalls nDuration
do
  #sumCalls=$((${sumCalls} + ${nCalls}))
  #sumDuration=$((${sumDuration} + ${nDuration}))
  sumCalls=`expr ${sumCalls} + ${nCalls}`
  sumDuration=`expr ${sumDuration} + ${nDuration}`
  echo "${sumCalls} ${sumDuration}"
  echo -n "${appName} ${sumCalls} ${sumDuration}" > temp.txt
done

tail -n1 temp.txt >> ${outFile}  

Оба приведенных выше утверждения не работают. Я получаю синтаксические ошибки.

Мой вопрос:
1. Где я ошибаюсь с кодом выше?
2. Есть ли лучший способ сделать это, чем записывать в и из файлов?

Спасибо
Sriram

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Пример Ruby (1.9+)

$ ruby -ane 'BEGIN{c=d=0};c+=$F[2].to_i;d+=$F[3].to_i;END{puts "APPNAME, #{c},#{d}"}' file
1 голос
/ 05 апреля 2011

Как уже говорилось, правильным инструментом будет awk.

К ошибкам: Код в порядке и работает (особенно оба выражения).Возможные ошибки:

  1. Вы не инициализируете свои переменные суммирования равными 0 (если они уже имеют значение, это может привести к неверным результатам.
  2. Если ваш файл содержит более 4 столбцов, вашread ведет себя по-разному: Read присваивает последнее переданное значение всегда остальной части строки! Т.е. ваша последняя переменная получает 5 записей столбца с разделенными пробелами значениями =>, и здесь expr может дать синтаксическую ошибку. Решение для этого: Добавить кстрока 5 переменная REST. С 4 столбцами он остается пустым, а остальные догоняют остальные.
1 голос
/ 05 апреля 2011

Вот для чего было построено awk:

cat ${file} | awk '{c = c + $3; d = d + $4} END {print "APPNAME", c, d}'

Следующая транскрипция показывает это в действии:

pax$ export appName=xyz

pax$ echo 'a b 1 2
...> a b 3 4
...> a b 5 6' | awk -vAPPNAME=${appName} '{c=c+$3;d=d+$4}END{print APPNAME,c,d}'
xyz 9 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...