我有一个文件,其中包含以下格式的数据:
字段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
如前所述,正确的工具会很尴尬。
对于错误:代码很好并且可以运行(尤其是两个表达式)。可能的错误:
- 您不会将求和变量初始化为 0(如果它们已经有值,则可能会产生错误的结果。
- 如果文件包含 4 列以上,则读取的行为会有所不同:Read 始终将最后传递的值分配给行的其余部分!即您的最后一个变量带有分配的 5 列条目 2 个空格分隔值 =>,这里的 expr 可能会给出语法错误。解决方案:在该行中添加一个 5 变量 REST。有 4 列,它保持空,更多的列会赶上其余的列。