文件 IO - 对字段的内容求和 - bash



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

字段

1 字段 2 n调用持续时间

我的任务是将 nCalls 和持续时间字段相加。到目前为止,我编写的代码如下:

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

谢谢
斯里拉姆

这就是

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

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. 您不会将求和变量初始化为 0(如果它们已经有值,则可能会产生错误的结果。
  2. 如果文件包含 4 列以上,则读取的行为会有所不同:Read 始终将最后传递的值分配给行的其余部分!即您的最后一个变量带有分配的 5 列条目 2 个空格分隔值 =>,这里的 expr 可能会给出语法错误。解决方案:在该行中添加一个 5 变量 REST。有 4 列,它保持空,更多的列会赶上其余的列。

最新更新