免费注册 查看新帖 |

Chinaunix

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

文本处理,比较难,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-20 19:35 |只看该作者 |倒序浏览
20可用积分
问个问题,环境是Solaris有一个文本文件,test.dat
#cat test.dat
3453343|32444,asd,42,345sa,asda5445,asdsa|,asdaas,,asd,,,asdadsad||sadad,sad~@%asdasd32432|
232|as2d,421,3452sa,asda2544,asd121sa,erasdaaaas,asdasdadsadsadad,sad~|@%asdasdasdsda|
ab2|aspp2d,ass,23,aaa,bbb,ddsdd,asdasdadsadsadad,sad~|@%asdasd
……
这么一个文件,格式是这样的,这个文件每行都是7列,
第一列为第一个'|'之前的数据,
第二列为第一个'|'到第一个','之间的数据
第三列为第一个','到第二个','之间的数据
第四列为第二个','到第三个','之间的数据
第五列为第三个','到第四个','之间的数据
第六列为第四个','到第五个','之间的数据
之后,本行数据剩下的都属于第七列
所以上面文件的数据应该是:
3453343     32444     asd     42     345sa     asda5445     asdsa|,asdaas,,asd,,,asdadsad||sadad,sad~@%asdasd32432|     
232     as2d     421     3452sa     asda2544     asd121sa    erasdaaaas,asdasdadsadsadad,sad~|@%asdasdasdsda|     
ab2     aspp2d     ass     23     aaa     bbb      ddsdd,asdasdadsadsadad,sad~|@%asdasd
……
现在需要对原始的test.dat做2个处理
1.去掉第一列内容,得到的文件应该是:
32444,asd,42,345sa,asda5445,asdsa|,asdaas,,asd,,,asdadsad||sadad,sad~@%asdasd32432|
as2d,421,3452sa,asda2544,asd121sa,erasdaaaas,asdasdadsadsadad,sad~|@%asdasdasdsda|
aspp2d,ass,23,aaa,bbb,ddsdd,asdasdadsadsadad,sad~|@%asdasd
……

2.剩余的6列每列都有长度要求,长度分别为9,12,7,8,15,300,对于每列的字段数据采用左对齐,不够长度的在后面用空格(为了容易看的方便,我用'M'代替空格表示)补齐。所以应该是下面这样的结果:
32444MMMM,asdMMMMMMMMM,42MMMMM,345saMMM,asda5445MMMMMMM,asdsa|,asdaas,,asd,,,asdadsad||sadad,sad~@%asdasd32432|MMMM(M太多,我不写那么多了)……
as2dMMMMM,421MMMMMMMMM,3452saM,asda2544,asd121saMMMMMMM,erasdaaaas,asdasdadsadsadad,sad~|@%asdasdMMMM……
aspp2dMMM,assMMMMMMMMM,23MMMMM,aaaMMMMM,bbbMMMMMMMMMMMM,ddsdd,asdasdadsadsadad,sad~|@%asdasdMMMMMM…………
各路大仙,还请施展绝技帮忙看看,谢谢。

[ 本帖最后由 sea_soft 于 2009-4-20 20:34 编辑 ]

论坛徽章:
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 [报告]
发表于 2009-04-20 19:45 |只看该作者

回复 #1 sea_soft 的帖子

如何定义列?去掉第一列不是去掉第一个|之前的内容了吗?
LZ描述的有点乱。

论坛徽章:
0
3 [报告]
发表于 2009-04-20 19:46 |只看该作者
这里肯定能找到你要的东西

http://sed.sourceforge.net/sed1line_zh-CN.html

论坛徽章:
0
4 [报告]
发表于 2009-04-20 19:46 |只看该作者
忘了说明,test.dat最后一列(第七列)存在很多汉字和逗号,|等乱七八糟的字符
比如
#cat test.dat
3453343,32444,asd,42,345sa,asda5445,asdsa|,asdaas,,asd,,,asdadsad||我是测试字符|
232,as2d,421,3452sa,asda2544,asd121sa,erasdaaaas,asdasdadsadhello测试d,sad~|@%asdasdasdsda|
ab2,aspp2d,ass,23,aaa,bbb,ddsdd,asdasdadsadsadad,sad~|@%谢谢各位asd
……

论坛徽章:
0
5 [报告]
发表于 2009-04-20 19:46 |只看该作者
原帖由 blackold 于 2009-4-20 19:45 发表
如何定义列?去掉第一列不是去掉第一个|之前的内容了吗?
LZ描述的有点乱。



有点, | 分不清

论坛徽章:
0
6 [报告]
发表于 2009-04-20 19:47 |只看该作者
原帖由 blackold 于 2009-4-20 19:45 发表
如何定义列?去掉第一列不是去掉第一个|之前的内容了吗?
LZ描述的有点乱。

是的,是这个意思,去掉第一列就是要把第一个'|'之前的都删掉,包括这个第一个'|'也删除

论坛徽章:
0
7 [报告]
发表于 2009-04-20 19:53 |只看该作者
原帖由 yuio654 于 2009-4-20 19:46 发表



有点, | 分不清

第一个|是我手工处理出来的,最原始的文件是第一个|也是用逗号,我为了好看,才换成的|,如果处理不方便,也可以再换成逗号

论坛徽章:
0
8 [报告]
发表于 2009-04-20 20:03 |只看该作者
楼主按照你的描述,第一列是第一个“|”之前的内容,删除第一列就是把第一个“|”以及前面的字符删除,但是你给的例子中,删除第一列后的效果却是删除第一个“,”以及前面的字符,这个……

[ 本帖最后由 kwokcn 于 2009-4-20 20:04 编辑 ]

论坛徽章:
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
9 [报告]
发表于 2009-04-20 20:23 |只看该作者

回复 #8 kwokcn 的帖子

对啊,LZ的描述自相矛盾。

我根据LZ想要的结果猜了一个:
  1. awk -F , '{s=$0;sub(/[^|]*,/,"",s); printf "%-9s,%-12s,%-7s,%-8s,%-15s,%-300s\n", $2,$3,$4,$5,$6,s}' test.dat
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-04-20 20:31 |只看该作者
啊~被黑哥抢了,我刚要发这个的~ T_T
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP