免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10393 | 回复: 23
打印 上一主题 下一主题

sed超大文件处理20多个G,内存不够用。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-17 09:22 |只看该作者 |倒序浏览
本帖最后由 木万万 于 2012-02-17 11:45 编辑

我想提取数据库的一张表的6个特定列,现大小已为21G。因为导出的文本文件每条记录当中也有某些是存在换行的,这个要实现的时候我用了复合命令”;“。然后用管道再用awk提取目的列。但命令敲出后,内存消耗飙升,最后不得不停掉。我是想问,是不是第一步我去掉换行(去掉意外换行后仍有八千多万条记录)的时候就已经破坏sed的管道操作,有没有好的建议。
机器系统是centOS,当然我本地的win7也安装了Cygwin Terminal,数据库是mysql(不过这个应该没有关系了)。

我在下面说了的,现在我把具体情况再说一下。。

首先,目的是提取这张21G大的表 properties 当中的第$1,$2,$3,$28,$29,$30,$31列。
命令如下,敬请高手指教:
  1. sed -e ':a;N;$ s/\\\n//g;ba'  properties.txt|sed  's/\\N/\\N"/g' | awk -F '",'  '{print$1,$2,$3,$28,$29,$30,$31}'|sed 's/"//g' >pro.txt
复制代码
以下是表中两条原始记录:

  1. "1","527","1830",\N,"时代豪苑200万好楼层好位置低价位","\
  2. \
  3. <h2>户型图</h2>\
  4. \
  5. ![时代豪苑 1室1厅1卫](http://img2.f.itc.cn/esf/5267/26/75/600x450_52672675.jpg)\
  6. \
  7. <h2>室内图</h2>\
  8. \
  9. ![时代豪苑](http://img4.f.itc.cn/esf/5267/26/70/600x450_52672670.jpg)\
  10. \
  11. ![时代豪苑](http://img4.f.itc.cn/esf/5267/26/72/600x450_52672672.jpg)\
  12. \
  13. ![时代豪苑](http://img4.f.itc.cn/esf/5267/26/73/600x450_52672673.jpg)\
  14. \
  15. 此房位于解放碑CBD中心的甲级写字楼,位置好,出入方便的黄金地段(在美美百货楼上),里面为办公装修,户型方正采光好,视野开阔,可拿来自用办公,也可出租,均让你得到意想不到
  16. 的高回报。交通非常便利,旁边就是轻轨车站!","200","11765",\N,"NS",\N,"1",\N,\N,\N,\N,"20","43",\N,\N,\N,"Rejected",\N,"91","4416721124132318","2011-11-23 09:52:24","2011-11-23 09:52:24","1","1","1","170.00","Error"
  17. "2","528","1831",\N,"中山公园附近,乐购旁边这么便宜的房子哪里找","\
  18. \
  19. <h2>室内图</h2>\
  20. \
  21. ![玉屏南路49弄](http://img1.f.itc.cn/esf/5257/90/51/600x450_52579051.jpg)\
  22. \
  23. ![玉屏南路49弄](http://img3.f.itc.cn/esf/5257/90/75/600x450_52579075.jpg)\
  24. \
  25. ![玉屏南路49弄](http://img4.f.itc.cn/esf/5257/92/25/600x450_52579225.jpg)\
  26. \
  27. 房屋介绍:这个房子原来是一室一厅的户型,房东之前自住,把中间的隔墙打通了,变成一室的户型了。房子朝正南,采光和阳光非常好,从早晒到晚。进门是厨房,向前走左转是卫生,再向前就是房间。前面还有一个阳台3.4个平米。从房子走路到武夷路的体操中心乐购只需要1分钟。非常非常的便捷。小区介绍:地段成熟,位于玉屏南路中山西路,靠武夷乐购、天山茶城等,交通便捷,地铁2、3、4号线中山公园站和2号线娄山关路站及3、4号线延安西路站,还有大量公交线路及高架线路供你出行选择。","74.7","23307",\N,"S",\N,"3",\N,\N,\N,\N,"6","6",\N,\N,\N,"Approved",\N,"91","4591919082716853","2011-11-23 09:52:24","2011-11-23 09:52:24","1","1","1","32.05","High"
复制代码
说下问题所在:
问题1:第6列当中存在不确定个规则换行即 \ + 回车 (因为规范记录应该是每条记录到换行结束的)。我的第一步就是要去掉这些规则换行
  1. sed -e ':a;N;$ s/\\\n//g;ba'
复制代码
问题2:我要用awk提取当中的目的列,但是每条记录间没有特定的分隔符,其实是\N在作影响,而且中间的文字当中可能含有英文的”,“。所以我把\N 替换成了 \N"
  1. 's/\\N/\\N"/g'
复制代码
为的是能出现‘”,’这种特定的分隔符,然后按照awk分割
  1. awk -F '",'  '{print$1,$2,$3,$28,$29,$30,$31}'
复制代码
。但结果当中是还会保留有一个英文的“。所以利用
  1. sed 's/"//g'
复制代码
,将"去掉。
想来大致便是这样,本人资质尚浅,原来做的都和这些不搭嘎的,有拙劣之处,还望不要见笑呀。。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2012-02-17 09:25 |只看该作者
回复 1# 木万万


    最好贴上你的命令。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-02-17 09:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-02-17 09:50 |只看该作者
回复 2# blackold


    命令如下,敬请高手指教:
  1. sed -e ':a;N;$ s/\\\n//g;ba'  properties.txt|sed  's/\\N/\\N"/g' | awk -F '",'  '{print$1,$2,$3,$28,$29,$30,$31}'|sed 's/"//g' >pro.txt
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-02-17 09:53 |只看该作者
回复 3# zooyo
额  呵呵 关键也不知道是要加多少 不会要加到21G,把整个文件读进去吧?? 而且最好有程序能克服的物理资源不占优势的方法,这才是牛人之道。。  呵呵  谢谢支持~~


   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2012-02-17 09:59 |只看该作者
回复 4# 木万万


    sed -e ':a;N;$ s/\\\n//g;ba'  properties.txt 这是把整个文件读入,当然吃内存啊。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
7 [报告]
发表于 2012-02-17 10:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2012-02-17 10:06 |只看该作者
本帖最后由 jason680 于 2012-02-17 10:13 编辑

回复 4# 木万万

use too many PIPE "|" and your file is too big ...
please write down what do you want to do ...
   

论坛徽章:
0
9 [报告]
发表于 2012-02-17 11:10 |只看该作者
本帖最后由 木万万 于 2012-02-17 11:47 编辑

回复 8# jason680
http://bbs.chinaunix.net/forum.p ... p;extra=&page=1

    好的,我仔细说一下。
额。。已将问题转贴至1楼。。

论坛徽章:
0
10 [报告]
发表于 2012-02-17 11:27 |只看该作者
回复 7# zooyo


    我在9楼贴了问题的具体情况,如果有更好的解决办法的话,还望大神给支个招哇。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP