免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何将连续的记录分开 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-26 21:54 |只看该作者 |倒序浏览
本帖最后由 temp_awk 于 2012-11-27 10:26 编辑

1、正常文本格式为:
     每条记录占一行,记录的字段之间用tab隔开
     示例:
     I    user1_IDokI   user1_Name    user1_Tel     ok
     I    user2_ID   user2_NameokI    user2_Tel     ok
     I    user3_ID   user3_Name    user3_TelokI     ok
     I    user4_ID   user4_NameokI    user4_Tel     ok
     I    user5_IDokI   user5_Name    user5_Tel     ok
     I    user6_ID   user6_NameokI    user6_Tel     ok
     I    user7_ID   user7_Name    user7_TelokI     ok
     I    user8_ID   user8_NameokI    user8_Tel     ok
     I    user9_IDokI   user9_Name    user9_Tel     ok
     O    user10_ID   user10_NameokI    user10_Tel     ok
     I    user11_ID   user11_Name    user11_TelokI     ok
     O    user12_ID   user12_NameokI    user12_Tel     ok
     I    user13_IDokI   user13_Name    user13_Tel     ok
     备注:记录的最后一个字段都是“ok”,并且每条记录的字段数是一样的。

2、现在该文本出现了问题:
     某些相邻记录粘到了一块
     示例:
     I    user1_IDokI   user1_Name    user1_Tel     ok
     I    user2_ID   user2_NameokI    user2_Tel     okI    user3_ID   user3_Name    user3_Tel     ok
     I    user4_ID   user4_Name    user4_TelokI     ok
     I    user5_IDokI   user5_Name    user5_Tel     okI    user6_ID   user6_NameokI    user6_Tel     okI    user7_ID   user7_Name    user7_TelokI     ok
     I    user8_ID   user8_NameokI    user8_Tel     ok
     I    user9_IDokI   user9_Name    user9_Tel     ok
     O    user10_ID   user10_NameokI    user10_Tel     ok
     I    user11_ID   user11_Name    user11_TelokI     ok
     O    user12_ID   user12_NameokI    user12_Tel     ok
     I    user13_IDokI   user13_Name    user13_Tel     ok
     备注:1)出错的只会是第一个字段为“I”的记录,或者说第一个字段为“O”的记录永远不会出错。
              2)红色字体的“okI”可作为出错标志,其它正常字段所含的字符串中可能含有“okI”,但不可能只含有“okI”,或者说其他字段不可能是“okI”
            

3、要求直接在源文件中更正错误
4、求各位大牛帮忙解答!

     
     
     

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2012-11-26 22:59 |只看该作者
  1. perl -lne '1 while(/([I|O].*?ok)(?{print $1})/g)' file
复制代码
楼主看看还有什么情况不满足。。随手写的 ,估计有问题

论坛徽章:
0
3 [报告]
发表于 2012-11-26 23:15 |只看该作者
回复 2# mcshell
额。。。源文件没有被修改。。。求大侠给个能直接修改源文件的办法。

   

论坛徽章:
0
4 [报告]
发表于 2012-11-26 23:22 |只看该作者
回复 2# mcshell
另外,当其他字段中出现包含“okI”的字符串时,会被错误的分割成多个记录。

   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2012-11-26 23:23 |只看该作者
你举几个文本的例子,把你考虑到的 都写进去。。

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
6 [报告]
发表于 2012-11-26 23:38 |只看该作者
  1. awk -vRS="ok" '{print $0 RT}' urfile | sed '/^$/'d
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-11-26 23:47 |只看该作者
本帖最后由 temp_awk 于 2012-11-26 23:55 编辑

回复 5# mcshell

备注:"5"相当于上面的"ok","5I"相当于上面的“okI”
I       EX5I9635967CS   2       35022100350002    20121124          5
O      EY2fsd5I000dfs   2       43004900430062    20121124          5
I      EY2395I00062CS   2       43004900430062    20121124          5
I       ET725813322CS   2       46300000043000    20121124          5I     EX5I9635967CS   2       350221003500       20121124      5   
I      EK043332861GB    2       21500000213000    20121124          5
I       5IMS1473155IN   2       35022100350002    20121124          5I     EX5I9635967CS   2       350221003500       20121124      5
I       EQ814696225CS   2       51000000511300    20121124          5I       ET725813322CS   2       46300000043000    20121124     5I     EX5I9635967CS   2       350221003500       20121124      5
I       MS147311604CN   2       35022100350002    21200688          5      
O      EY2395I00062CS   2       43004900430062    20121124          5
O       EX5I9635967CS   2       35022100350002    20121124          5


   

论坛徽章:
0
8 [报告]
发表于 2012-11-26 23:53 |只看该作者
回复 6# 代号:军刀
1、当其他字段中出现包含“okI”的字符串时,会被错误的分割成多个记录。
2、没有修改源文件
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2012-11-26 23:56 |只看该作者
本帖最后由 yestreenstars 于 2012-11-27 11:17 编辑

不会这么简单吧?
  1. sed -i 's/ okI / ok\nI /g' file
复制代码

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
10 [报告]
发表于 2012-11-27 00:06 |只看该作者
希望lz发附件
否则容易有考虑不周的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP