+ -
当前位置:首页 → 问答吧 → shell脚本--对原文件的每行记录操作,写入到新文件,速度运行慢,请大虾指点

shell脚本--对原文件的每行记录操作,写入到新文件,速度运行慢,请大虾指点

时间:2011-05-14

来源:互联网

一个文本处理的脚本,数据量比较大,运行速度慢,希望大虾们指点
源文件大概如下:
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
……
原始文件大小不确定,以50万行为例

目标文件要求如下:
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05    注:第二个字段20110214000000是取当前操作时间
……
50万行

源文件每一行的记录以'|'为字段分隔符,要求取出第1,3,5个字段,并在新的记录前插入abc和20110514000000(当前操作时间)两个字段。
还要求目标文件不能超出指定大小,如果超出则写入新文件。并且生成文件名从0000-9999序号来生成。例:abcdef_0000.dat 到 abcdef_9999.dat
我的思路是
nowtime=`date +%Y%m%d%H%M%S`
for record in $(cut -d '|' -f1,3,5 源文件名)
do
   echo "abc|$nowtime|取出字段“  >  目标文件
   if  超出指定大小
   then
         新建目标文件
   fi
done

现在的问题是
1.如果在插入一行后,怎样判断目标文件的大小是否超出。
2.如果源文件数据量比较大,一行一行的操作会比较慢,而且每插入一行,还要判断是否
超出指定大小,这样肯定比较费时,有没有批量执行的命令或则更快的命令?
3.可不可以在插入完后,判断文件的大小,用split命令来按照规定的文件大小来分割,
也就是  “if  超出指定大小”这个判断放在for循环的外面,但如果是这样的话,文件名
又比较难生成。因为split分割的文件是从1开始递增的,那如果我现在的文件流水号是5
那么操作起来就比较麻烦。

作者: C307307   发布时间: 2011-05-14

自己来顶一个

作者: C307307   发布时间: 2011-05-14

本帖最后由 南极雨 于 2011-05-14 20:26 编辑

回复 C307307


    这样肯定慢...用awk和sed吧
备份原文件!!!
  1. nowtime=`date +%Y%m%d%H%M%S`;sed "s/^/abc\|$nowtime/" file | awk '{print $1,$2,$4,$5,$6}'
复制代码
  1. nowtime=`date +%Y%m%d%H%M%S`;sed -e "s/\(.*\)|02\(.*\)/\1\2/;s/^/abc|$nowtime/" file
复制代码
-e可以删除,第二个应该比第一个快点儿

作者: 南极雨   发布时间: 2011-05-14

谢谢楼上,我去试试。

作者: C307307   发布时间: 2011-05-14

第一个代码我没看明白,前面的sed是在每行前面插入字段,那后面这个awk是做什么用的,而且这个管道命令貌似没用。

作者: C307307   发布时间: 2011-05-14