免费注册 查看新帖 |

Chinaunix

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

请问用perl如何处理这种特殊格式的文档 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-25 08:41 |只看该作者 |正序浏览

  1. v1  v2  v3  v4  v5
  2.   v6   v7    v8
  3. 1   2   3    4      5
  4.   6     7    8

  5. 1.1 2   3.2  11   6
  6.   s     f     9

  7. 3    4    6    9     4
  8.   0    2     6
  9. ......
  10. ......
复制代码


文档的格式如上所示,有变量V1至V8,分别有对应值,本意是V1-V8在一行内显示,对应的值也要在一行内显示,可是 现在除了完整的行被回车分成两行外,每行之间还被多插了个回车,导致上面的情况。假设有10000行。

如何做到显示正确的格式?如下:


  1. v1  v2  v3  v4  v5  v6   v7    v8
  2. 1    2   3     4    5  6     7    8
  3. 1.1 2   3.2  11   6  s     f    9
  4. 3    4   6     9    4  0     2    6
  5. ......
  6. ......
复制代码


谢谢大家!

[ 本帖最后由 hjp0021 于 2008-9-25 08:44 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
14 [报告]
发表于 2008-09-26 12:25 |只看该作者

这个题目还是用sh简单

$ cat urfile
v1  v2  v3  v4  v5
  v6   v7    v8
1   2   3    4      5
  6     7    8

1.1 2   3.2  11   6
  s     f     9

3    4    6    9     4
  0    2     6
$ xargs -n8 < urfile
v1 v2 v3 v4 v5 v6 v7 v8
1 2 3 4 5 6 7 8
1.1 2 3.2 11 6 s f 9
3 4 6 9 4 0 2 6

论坛徽章:
0
13 [报告]
发表于 2008-09-25 16:12 |只看该作者
谢谢楼上各位!我再好好琢磨琢磨。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
12 [报告]
发表于 2008-09-25 12:36 |只看该作者
原帖由 hjp0021 于 2008-9-25 11:37 发表
while(){
    chomp;
    print;
    /\S/ and print scalar ;
}

谢谢!这么做实践证明是可行的。
关键是/\S/ and print scalar ;,我不理解。
/\S/匹配的是非空格字符串,在我的例子中也就是匹配各个 ...

这个伪函数可以用于 LIST 里,当在列表环境中计算会生成一个不同的结果的时候,强迫 EXPR 在标量环境中计算。比如:
   my ($nextvar) = scalar <STDIN>;
避免 <STDIN> 在做赋值之前从标准输入把所有的行都读了进来,因为给一个列表(甚至是一个 my 列表)赋值都会产生一个列表环境。(在这里例子里如果没有 scalar,那么来自 <STDIN> 的第一行仍然会赋予 $nextvar,但是随后的行将会被读取并抛弃,因为我们赋值的目标列表只能接受一个标量数值。)
...
因为 print 函数是一个 LIST 操作符...

评分

参与人数 1可用积分 +10 收起 理由
flw + 10 我很赞同

查看全部评分

论坛徽章:
0
11 [报告]
发表于 2008-09-25 11:37 |只看该作者
  1. while(<DATA>){
  2.     chomp;
  3.     print;
  4.     /\S/ and print scalar <DATA>;
  5. }
复制代码


谢谢!这么做实践证明是可行的。
关键是/\S/ and print scalar <DATA>;,我不理解。
/\S/匹配的是非空格字符串,在我的例子中也就是匹配各个变量的值,那么后边的scalar是强迫语句位于标量环境,为什么scalar是对<DATA>操作,而不是对"$_"操作呢?这一句的作用很不解。

还有,最后能生成期望的格式:

  1. v1  v2  v3  v4  v5  v6   v7    v8
  2. 1    2   3     4    5  6     7    8
  3. 1.1 2   3.2  11   6  s     f    9
  4. .
复制代码

那么,各行之间的回车符又是从哪里来的?

望不吝赐教。

论坛徽章:
0
10 [报告]
发表于 2008-09-25 11:18 |只看该作者
切,你个大喷油, 悠着点

[ 本帖最后由 forlorngenius 于 2008-9-25 11:34 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-09-25 11:11 |只看该作者
原帖由 forlorngenius 于 2008-9-25 10:59 发表
难道你没有用re?

小喷油,用和滥用是两码事。学着点儿。

论坛徽章:
0
8 [报告]
发表于 2008-09-25 10:59 |只看该作者

回复 #7 flw 的帖子

难道你没有用re?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-09-25 10:21 |只看该作者
我觉得还是尽量不要滥用正则表达式比较好。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2008-09-25 10:20 |只看该作者
perl -l0ne 'print; /\S/ and print scalar <>' /path/to/your/file
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP