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
那么操作起来就比较麻烦。
源文件大概如下:
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吧
备份原文件!!!
复制代码
复制代码
-e可以删除,第二个应该比第一个快点儿
回复 C307307
这样肯定慢...用awk和sed吧
备份原文件!!!
- nowtime=`date +%Y%m%d%H%M%S`;sed "s/^/abc\|$nowtime/" file | awk '{print $1,$2,$4,$5,$6}'
- nowtime=`date +%Y%m%d%H%M%S`;sed -e "s/\(.*\)|02\(.*\)/\1\2/;s/^/abc|$nowtime/" file
作者: 南极雨 发布时间: 2011-05-14
谢谢楼上,我去试试。
作者: C307307 发布时间: 2011-05-14
第一个代码我没看明白,前面的sed是在每行前面插入字段,那后面这个awk是做什么用的,而且这个管道命令貌似没用。
作者: C307307 发布时间: 2011-05-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28