免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sthcf
打印 上一主题 下一主题

新手的烦恼--文件处理的效率问题[已解决] [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-12-15 18:44 |只看该作者
难度很大,很有挑战,赶公交去了,回家再弄。

论坛徽章:
0
22 [报告]
发表于 2008-12-15 18:52 |只看该作者
我的文本是有部分是符合要求的(6行连续一起),有部分不是,拜托三位大大了

论坛徽章:
0
23 [报告]
发表于 2008-12-15 18:59 |只看该作者

  1. [root@rhel5test test]# awk -f ss.awk d
  2. 20081204 23:23:05  13556409826  15  2020 0~4819~0~0~0~0~0~0 0~4804~0~0~0~0~0~0 7544002264722
  3. 20081204 23:23:05  13612384090  15  2020 0~0~0~0~0~915~0~0 0~0~0~0~0~900~0~0 7544004393795
  4. 20081204 23:23:05  15815091162  15  2020 0~515~0~0~0~0~0~0 0~500~0~0~0~0~0~0 7544005374769
  5. [root@rhel5test test]# cat ss.awk
  6. BEGIN{
  7. FS="[]|[]+"
  8. }
  9. {if(/解析清单/){
  10.         key1=$1$4$11
  11.         getline
  12.         if(/转换后帐单科目/){
  13.                 gsub(/.*转换后帐单科目: /,"",$0)
  14.                 gsub(/ FILE:.*/,"",$0)
  15.                 key2=$0
  16.                 getline
  17.                 if(/普通单 FILE:/ || /长单 FILE:/){
  18.                         getline
  19.                         if(/Ebox Info:/){
  20.                                 key3=$4
  21.                                 getline
  22.                                 if(/After Woff Ebox Info:/){
  23.                                         key4=$4
  24.                                         getline
  25.                                         if(/销帐结果/){
  26.                                         key5=$4
  27.                                         {print key1,key2,key3,key4,key5}
  28.                                         next
  29.                                         }
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34. }
  35. }
复制代码

不知是不是你要的

论坛徽章:
0
24 [报告]
发表于 2008-12-15 20:12 |只看该作者
原帖由 nuclearxin 于 2008-12-15 18:59 发表

[root@rhel5test test]# awk -f ss.awk d
20081204 23:23:05  13556409826  15  2020 0~4819~0~0~0~0~0~0 0~4804~0~0~0~0~0~0 7544002264722
20081204 23:23:05  13612384090  15  2020 0~0~0~0~0~915~0~0  ...


已经差不多是我要的东西了,但是如果出现像下面这样的顺序的话,会丢失一次6行的循环,如下面这个是可以出来两行的,但这脚本跑的话应该只会出来一行(另外 ~ 这个符号也需要去掉,所有域之间用|做分隔符)


解析清单
解析清单
解析清单
转换后帐单科目
普通单
Ebox Info
After Woff Ebox Info
销帐结果
解析清单
转换后帐单科目
普通单
Ebox Info
After Woff Ebox Info
销帐结果

[ 本帖最后由 sthcf 于 2008-12-15 20:27 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-12-15 21:30 |只看该作者
cat urfile|tr -d '\n'|sed -r 's#([0-9 :]+)\[INFO \]\([0-9]+\) 解析清单 \[ ([0-9]+)([^|]+\|){7} ([0-9]+)[^~]+([0-9~]{18})[^~]+([0-9~]{18})([^|]+\|){2} ([0-9]{4})[^,]+,[^]]+\]#\1;\2;\4;\5;\6;\8\n#g'
这是我这辈子写过的最恶心的正则了,调试了N个小时。

论坛徽章:
1
2015年亚洲杯之韩国
日期:2015-04-24 09:07:02
26 [报告]
发表于 2008-12-15 21:33 |只看该作者

回复 #23 nuclearxin 的帖子

FS="[]|[]+" 这是什么写法呢?

论坛徽章:
0
27 [报告]
发表于 2008-12-15 21:48 |只看该作者
在第一行加了一个$11+0 !=0 之后是可以符合我的要求的,但是跑出来结果比实际情况少了716条数据,正常情况下跑出来应该要等于 普通单+长单的 数量和的,应该是跟之前那个会有一个skipping影响的,需要怎样处理才能出来正确的结果?

#awk -f test.awk realbill_ora_st_002_20081204_00080.log >tmp.txt
# cat tmp.txt|wc -l
   15265
#awk -F  '(/普通单/){print $0}' realbill_ora_st_002_20081204_00080.log|wc -l
   15473
# awk -F  '(/短单/){print $0}' realbill_ora_st_002_20081204_00080.log|wc -l
    1770
#awk -F  '(/长单/){print $0}' realbill_ora_st_002_20081204_00080.log|wc -l
     508
#awk -F  '(/销帐结果/){print $0}' realbill_ora_st_002_20081204_00080.log|wc -l
   17751
# awk -F '|' '(/解析清单/ && $8+0 != 0 ){print $1}' realbill_ora_st_002_20081204_00080.log|wc -l
   17751

我之前那个低效率的脚本跑出来的结果也是这样,少了716行,应该是那个skipping影响的结果,是否有什么方法可以去除这个影响?

论坛徽章:
0
28 [报告]
发表于 2008-12-15 21:49 |只看该作者
原帖由 biglazybug 于 2008-12-15 21:33 发表
FS="[]|[]+" 这是什么写法呢?


这个我之前有看过帖子是这么解释的:FS="[]|[]+"  符合正则表达式,[]里面的任何一个字符可以作为分隔符号,碰到任何一个字符都作为一个域对待。 而+代表,把多连续的域字符作为一个对待

论坛徽章:
0
29 [报告]
发表于 2008-12-15 22:19 |只看该作者
原帖由 walkerxk 于 2008-12-15 21:30 发表
cat urfile|tr -d '\n'|sed -r 's#([0-9 :]+)\\([0-9]+\) 解析清单 \[ ([0-9]+)([^|]+\|){7} ([0-9]+)[^~]+([0-9~]{18})[^~]+([0-9~]{18})([^|]+\|){2} ([0-9]{4})[^,]+,[^]]+\]#\1;\2;\4;\5;\6;\8\n#g'
这是我 ...


钻了好一会,完全没看懂 ,试执行了一下
sed: Not a recognized flag: r
Usage:  sed [-n] Script [File ...]
        sed [-n] [-e Script] ... [-f Script_file] ... [File ...]

呵呵 把r参数去掉执行
sed: 0602-404 Function s#([0-9 :]+)\[INFO \]\([0-9]+\) 解析清单 \[ ([0-9]+)([^|]+\|){7} ([0-9]+)[^~]+([0-9~]{18})[^~]+([0-9~]{18})([^|]+\|){2} ([0-9]{4})[^,]+,[^]]+\]#\1;\2;\4;\5;\6;\8\n#g cannot be parsed.

论坛徽章:
0
30 [报告]
发表于 2008-12-15 22:19 |只看该作者
原帖由 sthcf 于 2008-12-15 20:12 发表


已经差不多是我要的东西了,但是如果出现像下面这样的顺序的话,会丢失一次6行的循环,如下面这个是可以出来两行的,但这脚本跑的话应该只会出来一行(另外 ~ 这个符号也需要去掉,所有域之间用|做分隔符)
...


我在家没有环境调试
不过可以在
第一个if后面用
while(/解析清单/)getline

  1. [root@rhel5test test]# cat ss.awk
  2. BEGIN{
  3. FS="[]|[]+"
  4. }
  5. {if(/解析清单/){
  6.         key1=$1$4$11
  7.         getline
  8.         while(/解析清单/){key1=$1$4$11;getline}
  9.         
  10.         
  11.         if(/转换后帐单科目/){
  12.                 gsub(/.*转换后帐单科目: /,"",$0)
  13.                 gsub(/ FILE:.*/,"",$0)
  14.                 key2=$0
  15.                 getline
  16.                 if(/普通单 FILE:/ || /长单 FILE:/){
  17.                         getline
  18.                         if(/Ebox Info:/){
  19.                                 gsub(/~/," ",$4)
  20.                                 key3=$4
  21.                                 getline
  22.                                 if(/After Woff Ebox Info:/){
  23.                                         gsub(/~/," ",$4)
  24.                                         key4=$4
  25.                                         getline
  26.                                         if(/销帐结果/){
  27.                                         gsub(/~/," ",$4)
  28.                                         key5=$4
  29.                                         {print key1,key2,key3,key4,key5}
  30.                                         next
  31.                                         }
  32.                                 }
  33.                         }
  34.                 }
  35.         }
  36. }
  37. }
复制代码



does it work?
呵呵忘了改~这个符号了改了

[ 本帖最后由 nuclearxin 于 2008-12-15 22:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP