免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求一个思路,一个文件拆分后的思路 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-17 14:40 |只看该作者 |倒序浏览
本帖最后由 expert1 于 2013-03-23 16:22 编辑
  1. 有一个文件比较大,大概有100万行, 我要用脚本对它进行处理,但是由于文件太大,需要20小时左右才能处理完成,时间太长了,我想将这个文件通过split命令拆分为若干文件,然后通过脚本同时处理拆分后的文件。 但是又不知道这个文件会被拆分为几个文件,不太好判断,有没有人有这方面经验啊?给点思路吧。

  2. 总而言之,就是将一个大文件拆成若干小文件,然后多进程的对这些小文件进行处理以缩短处理时间。谢谢了

  3. 问题已经得到解决,现在写以下总结:

  4. 根据大侠们的建议我将原数据及要求重新整理如下:

  5. 将一个日志文件中的关键字及关键字值根据要求进行排列,以便于sqlldr入库使用,关键字值之间以逗号分隔。

  6. 日志中,第一种类型的日志:

  7. /abc/aaa_09152011:[15/09/2011 01:28:38:613 CST] AppFac/com.bbb.abba.api.appFac: Client configuration for action=userAuth is [AP=3.1.5.167;ID=710036098;AS=7;RID=03A7FE80;FWR=CD30;CID=53;IN=710036098;CP=e;RND=75C7B61BCE854DB1B31A4AA8978EEF9B;N=1000056512;CLD=16781312;LN=zhcn;IID=0;ST=;PL=2364;TZ=28800;DN=;DIF=;RAWAPI=3.1.5.167]
  8. /abc/aaa_09152011:[15/09/2011 01:28:39:694 CST] AppFac/com.bbb.abba.api.appFac: Client configuration for action=userAuth is [SC=16781312;AP=3.1.5.145;ID=650013208;AS=7;RID=1F605980;FWR=3293;CID=53;IN=650013208;CP=e;RND=90BF88495ECE320D81BD718D27069EC7;N=1000056512;CLD=16781312;LN=zhcn;IID=0;ST=;PL=40065;TZ=28800;DN=;DIF=;RAWAPI=3.1.5.145]
  9. /abc/aaa_09152011:[15/09/2011 22:42:55:654 CST] AppFac/com.bbb.abba.api.appFac: Client configuration for action=getMsg&msgID=1 is [SC=16781312;AP=3.1.5.145;ID=241695284;AS=7;RID=A6E53BE5;FWR=3001;CID=53;IN=241695284;CP=e;RND=00CE58723237CE4A4F2C32B103AC62B0;N=1000132973;CLD=16781312;LN=zhcn;IID=0;ST=;PL=90100;TZ=28800;DN=;DIF=;RAWAPI=3.1.5.145]

  10. 第一类日志经过处理后,需要得出如下记录:

  11. 15/09/2011 01:28:38:613 CST,userAuth,,,,,,,,,,,,3.1.5.167,710036098,7,03A7FE80,CD30,53,710036098,e,75C7B61BCE854DB1B31A4AA8978EEF9B,1000056512,16781312,zhcn,0,,2364,28800,,,3.1.5.167,,,,,,,,,,,,,,
  12. 15/09/2011 01:28:39:694 CST,userAuth,,,,,,,,,,,16781312,3.1.5.145,650013208,7,1F605980,3293,53,650013208,e,90BF88495ECE320D81BD718D27069EC7,1000056512,16781312,zhcn,0,,40065,28800,,,3.1.5.145,,,,,,,,,,,,,,
  13. 15/09/2011 22:42:55:654 CST,getMsg,,,,,,,,,,1,16781312,3.1.5.145,241695284,7,A6E53BE5,3001,53,1695284,e,00CE58723237CE4A4F2C32B103AC62B0,1000132973,16781312,zhcn,0,,90100,28800,,,3.1.5.145,,,,,,,,,,,,,,

  14. 以上数据是根据 “等号” 为基础将 左边的为字段名(变量),右边的为数值读取出后并按照之前设定好的字段顺序排列,之后生成的新文件。由于键值太多达到47个,而又不是每条日志包含所有键值,在原始日志中的排列顺序也不完全一样,所以在处理结果中我们可以看出有多个,,,,产生,其间其实为空数据,而不是人为加入的“逗号”,又由于键值中特殊字符,需要做相应处理。

  15. 以下为第三种类型数据,思路一样只是取得的方法更加麻烦,中括号外数据多了点,另外需要取得returns 的值。

  16. /abc/aaa_09152011:[15/09/2011 06:27:23:811 CST] AppFac/com.bbb.abba.api.appFac: appBuilder on action=msgPkgDeleteACK&appID=12831713&price=455118536&time=1000074117&ID=80127&hw=DEBE60BB36B78CC77BC36D850A1458AD&repeat=12 returns 401 status=0
  17. /abc/aaa_09152011:[15/09/2011 06:27:24:708 CST] AppFac/com.bbb.abba.api.appFac: Client configuration for action=msgPkgDeleteACK&appID=13066620&price=479938200&time=999827776&ID=571700982&hw=456CBA28ED71279E1A35B488804F97FF is [SC=16781312;AP=3.1.5.186;ID=571700982;AS=7;RID=817DB7A3;FWR=v1.03;CID=53;IN=571700982;CP=e;RND=019D63AFB0C678CC2BB7C49FCFFF7E69;N=1000074445;CLD=16781312;LN=zhcn;IID=0;ST=;PL=110006;TZ=28800;DN=58865766;DIF=;RAWAPI=3.1.5.186]
  18. /abc/aaa_09152011:[15/09/2011 06:27:25:862 CST] AppFac/com.bbb.abba.api.appFac: appBuilder on action=msgPkgDeleteACK&appID=13066620&price=479938200&time=999827776&ID=571700982&hw=456CBA28ED71279E1A35B488804F97FF returns 200 status=0

  19. 所以关键字为:$HOSTNAME,$LOCAL_TIME,$action,$AppId,$appID,$itemID,$price,$prevPrice,$prePay,$PkgId,$license,$repeat,$msgID,$SC,$AP,$ID,$AS,$RID,$FWR,$CID,$IN,$CP,$RND,$N,$CLD,$LN,$IID,$ST,$PL,$TZ,$DN,$DIF,$RAWAPI,$AUTH,$API,$PLAT,$LANGUAGE,$CARRIER,$RAND,$time,$HASH,$hw,$txid,$catId,$RETURNS,$status,$AUTHSCHEME

  20. 根据我的要求,在jason680不断地帮助下,最后得出以下语句:此语句根据我的要求在第一个字段加了主机名
  21. 由于是solaris系统,该语句只用使用该路径想的awk才能正常运行
  22. /usr/xpg4/bin/awk -F'[]=; &[]+' -v hn="$HOSTNAME" 'BEGIN{t=47;a["action"]=2;a["AppId"]=3;a["appID"]=4;a["returns"]=44;a["status"]=45;a["AUTHSCHEME"]=46}{delete b;b[1]=$2" "$3;for(n=1;n++<t;)if(a[$n]!="")b[a[$n]]=$(n+1);printf hn",";for(n=0;n++<t;)printf "%s",b[n]",";print""}'

  23. 由于字段太多,4-44之间的多个字段我就不重复些了。
  24. 对于该语句有不理解的可以看一下 第30楼 jason680大侠有详细解释 ,真是太感谢了,又学到了新东西。
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2011-09-17 15:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-09-17 16:50 |只看该作者
或许是你处理方法上存在问题啊,你可以说出本意,shell ,awk ,sed, perl处理的效率和算法思路的不同时间 ...
zooyo 发表于 2011-09-17 15:24



    是这样的,是处理一段比较混乱的日志,通过eval命令从日志中提取字段信息,并且按照固定格式写入文件中,为了能够更好的提取信息,其中作了一些操作也是论坛里的几个高手帮忙解决的, 比如 多余的特殊字符等问题,我贴一下脚本,请帮忙看看那里还能优化。
  1. grep ID /abc/aaa_09152011* | while read line
  2. do
  3. LOCAL_TIME=`echo $line |cut -d\[ -f2| cut -d\] -f1`
  4. eval `echo $line | grep -v returns | grep -v fails|awk '{print $8}' | tr '&' ';' |tr '%' '0'| nawk -F ";" '{printf $1;for(i=2;i<=NF;i++)printf $i~/\=/?";"$i:$i;print ""}' |nawk -F ";" '{for(i=1;i<=NF;i++){gsub(/'\''/,"",$i);sub("=","='\''",$i);sub(/$/,"'\''",$i);printf $i";"};print ""}'`
  5. eval `echo $line | grep -v returns | grep -v fails|awk '{print $10}' | sed 's/^.\(.*\).$/\1/' |tr '%' '0'| nawk -F ";" '{printf $1;for(i=2;i<=NF;i++)printf $i~/\=/?";"$i:$i;print ""}' |nawk -F ";" '{for(i=1;i<=NF;i++){gsub(/'\''/,"",$i);sub("=","='\''",$i);sub(/$/,"'\''",$i);printf $i";"};print ""}'`
  6. eval `echo $line | grep -v returns | grep fails|awk '{print $5}' | tr '&' ';' |tr '%' '0'| nawk -F ";" '{printf $1;for(i=2;i<=NF;i++)printf $i~/\=/?";"$i:$i;print ""}' |nawk -F ";" '{for(i=1;i<=NF;i++){gsub(/'\''/,"",$i);sub("=","='\''",$i);sub(/$/,"'\''",$i);printf $i";"};print ""}'`
  7. eval `echo $line | grep -v returns | grep fails|awk '{print $7}' | sed 's/^.\(.*\).$/\1/' |tr '%' '0'| nawk -F ";" '{printf $1;for(i=2;i<=NF;i++)printf $i~/\=/?";"$i:$i;print ""}' |nawk -F ";" '{for(i=1;i<=NF;i++){gsub(/'\''/,"",$i);sub("=","='\''",$i);sub(/$/,"'\''",$i);printf $i";"};print ""}'`
  8. eval `echo $line | grep returns | awk '{print $7}' | tr '&' ';' |tr '%' '0'| nawk -F ";" '{printf $1;for(i=2;i<=NF;i++)printf $i~/\=/?";"$i:$i;print""}' |nawk -F ";" '{for(i=1;i<=NF;i++){gsub(/'\''/,"",$i);sub("=","='\''",$i);sub(/$/,"'\''",$i);printf $i";"};print ""}'`
  9. eval `echo $line | grep returns | awk '{print $10}'`
  10. RETURNS=`echo $line | grep fails | awk '{print $8}'`
  11. RETURNS=`echo $line | grep returns | awk '{print $9}'`
  12. echo $HOSTNAME,$LOCAL_TIME,$action,$catId,$RETURNS,$status,$AUTHSCHEME >> /tmp/test_2.txt
  13. LOCAL_TIME='';action='';status='';AUTHSCHEME=''
  14. done
复制代码
至于后面 输出字段有 30多个,我就不全贴出来了,就截取了几个,请帮忙看看是否提高处理速度,还是只能通过文件截取的方法提高速度

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
4 [报告]
发表于 2011-09-17 17:49 |只看该作者
好强大!

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2011-09-17 18:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-09-17 18:19 |只看该作者
呃,悲剧啊,看来还是要找办法截断文件啊,多线程处理。

论坛徽章:
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
7 [报告]
发表于 2011-09-17 18:28 |只看该作者
回复 6# lightning


优化你的脚本吧,比弄什么多线程更实际。
明明1个awk可以解决的事。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
8 [报告]
发表于 2011-09-17 19:04 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
9 [报告]
发表于 2011-09-17 20:06 |只看该作者
Tim哥说了,一个awk就能搞定,楼主赶紧给点真是数据出来吧

论坛徽章:
0
10 [报告]
发表于 2011-09-17 21:59 |只看该作者
楼主是NB的管道工
但对shell来说,多一个管道,效率就降一级
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP