2011-04-05 45 views
0

我有一个包含下列格式的数据文件:总结字段的内容 - 庆典

场1场2 nCalls时间

我的任务就是总结了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.有没有更好的方法来做到这一点比写入和退出文件?

感谢,
斯利拉姆

+0

什么是错误你正在接受什么? – 2011-04-05 06:17:06

+0

你的意思是哪个“两个”陈述(有11行)?首先提示而不是cat $ file |你可以用<$ file来管道。正确的工具是(g)awk。 – flolo 2011-04-05 06:19:06

+0

@flolo:我正在尝试执行+ =的bash相当的语句。为了同样的目的,我尝试了两种“种类”的陈述,但其中没有一种能够奏效。 – Sriram 2011-04-05 06:41:02

回答

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

一个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

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

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

  1. 你不变量初始化总计为0(如果他们已经值比它可能会产生错误的结果
  2. 如果您的文件包含超过4列,你读的行为不同。 Read指定最后传递的值总是剩下的那一行!也就是说,你的最后一个变量得到一个5列的条目2空间分隔值赋值=>这里expr可以给出一个语法错误解决方案:添加一行5变量REST,4列保持空置,其余部分保留空余,