免费注册 查看新帖 |

Chinaunix

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

求助,请各位高手支招,谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-29 23:50 |只看该作者 |倒序浏览
本帖最后由 net_lin 于 2010-11-29 23:51 编辑

想对一个若干文本进行处理和格式化输出,用shell处理起来很麻烦,效率也不高,想请教一下perl怎么处理
文本类似以下格式:

段落1
id       字段1   字段2   字段3 ...
0x3138   256     456     115
0x3139   0       32      654
0x3145   156     56      185
0x3137   0       32      1654

段落2
id       字段18   字段19   字段20 ...
0x3138   256      456      115
0x3139   0        32       654
0x3145   156      56       185
0x3137   0        32       1654

段落3
id1    id2    字段1   字段2   字段3 ...
0x0054 1      fasf    412     8098
0x0054 2      asf     1412    1098
0x0014 1      fdassf  12      109

段落4
id1    id2    字段16   字段17   字段18 ...
0x0054 1      kmsdf    42       98
0x0054 2      fadff    2        0

共有4个段落,段落间空行分隔,每个段落头有段落头名称,每个段落头的下一行为字段名称,字段个数不确定,字段间以多个空格分隔,段落1和段落2通过第一个字段(id)可进行关联,段落3和段落4通过第一个字段(id1)和第二个字段(id2)可关联,要求将第1个段落和第2个段落关联后将所有字段放在同一行内输出(字段分隔符为逗号),即输出为:
id,字段1,字段2,字段3 ... 字段18,字段19,字段20 ...
第3个段落和第4个段落也实现同样的功能,(注:段落间的关联可能存在找不到对应的关联行,找不到的关联由默认值0替代)

额外的要求为将输出对指定的某几个字段进行排序(升序或降序),各自取出按这几个字段排序后的前10行(去重后输出),需要考虑一定的效率,如1M大小的文件处理不超过2秒,请各位高手支招,谢谢!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2010-11-30 00:25 |只看该作者
建个 hash, key 为 id 值为(字段 => 值)的 hashref。

{
    id => {
        字段1 => 值1,
        字段2  => 值2,
        ...
    },
    ...
}

你用数据库更简单

论坛徽章:
0
3 [报告]
发表于 2010-11-30 10:30 |只看该作者
只写了部分符合条件的语句,你看着改改吧

# cat data2.txt
section1
id       col1   col2     col3
0x3138   256     456     115
0x3139   0       32      654
0x3145   156     56      185
0x3137   0       32      1654

section2
id       col18   col19     col20
0x3138   256      456      115
0x3139   0        32       654
0x3145   156      56       185
0x3137   0        32       1654


# perl -00  -ne '/section/  and print' data2.txt| perl -aF'\s+' -ne '/section/ or $rec{$F[0]} .= " " . join(" ",@F[1..3]); END{foreach (reverse sort keys %rec){print "$_  $rec{$_}\n"}}'

id   col1 col2 col3 col18 col19 col20
0x3145   156 56 185 156 56 185
0x3139   0 32 654 0 32 654
0x3138   256 456 115 256 456 115
0x3137   0 32 1654 0 32 1654

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-11-30 10:57 |只看该作者
需求说的挺清楚的。
可既然知道这事儿 Perl 能干,为什么不学学 Perl 呢?这可是一个不错的契机呢。
你这样子下去永远都不会 Perl,遇到类似的问题永远都得问人。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP