求和字段的内容 - bash

时间:2011-04-05 06:11:27

标签: bash file-io sum while-loop

我有一个包含以下格式数据的文件:

字段1字段2 nCalls持续时间

我的任务是对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.有没有比写入和退出文件更好的方法?

谢谢,
斯利拉姆

3 个答案:

答案 0 :(得分:1)

这是为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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如前所述,正确的工具将是awk。

错误:代码很好并且运行(尤其是两个表达式)。 可能的错误:

  1. 你不要将你的总和变量初始化为0(如果它们已经有价值而不是产生错误的结果。
  2. 如果您的文件包含4列以上,则您的读取行为会有所不同: 读取始终分配最后传递的值!即你的最后一个变量得到5列条目2空格分隔值=>这里expr可以给出语法错误。解决方案:将5变量REST添加到该行。有4列它保持空白,剩下的就更多了。