【发布时间】:2014-05-05 08:40:25
【问题描述】:
我在一个文件中有两列,我想自动对每行的两个值求和
例如
read write
5 6
read write
10 2
read write
23 44
然后我想总结每一行的“读取”和“写入”。最终在求和之后,我找到了最大和并将该最大值放入文件中。我觉得我必须使用 grep -v 来删除每行的列标题,正如答案中所述,这会使代码效率低下,因为我只是为了读取一行而对整个文件进行 grep。
我目前在 bash 脚本中(在 $x 是文件名的 for 循环中)对列进行逐行求和
lines=`grep -v READ $x|wc -l | awk '{print $1}'`
line_num=1
arr_num=0
while [ $line_num -le $lines ]
do
arr[$arr_num]=`grep -v READ $x | sed $line_num'q;d' | awk '{print $2 + $3}'`
echo $line_num
line_num=$[$line_num+1]
arr_num=$[$arr_num+1]
done
但是,要求和的文件有 270,000 多行。该脚本已经运行了几个小时,但还远未完成。有没有更有效的方法来写这个,这样它就不会花这么长时间?
【问题讨论】:
-
位非正统..从那里导入数据库和SUM?
-
不清楚 READ 的挂断是什么;我怀疑你没有告诉我们关于输入数据格式的全部故事。
-
您的脚本正在读取整个文件,为每一行提取一行。难怪它需要很长时间。
-
为 while 循环的每次迭代调用
grep、sed和awk可能是导致性能问题的主要因素。特别是考虑到grep在每次迭代中都有效地读取了整个文件 -
你需要知道行号是什么吗?你想要的输出格式到底是什么?
标签: bash unix solaris performance