- 论坛徽章:
- 0
|
本帖最后由 expert1 于 2013-03-23 16:22 编辑
- 有一个文件比较大,大概有100万行, 我要用脚本对它进行处理,但是由于文件太大,需要20小时左右才能处理完成,时间太长了,我想将这个文件通过split命令拆分为若干文件,然后通过脚本同时处理拆分后的文件。 但是又不知道这个文件会被拆分为几个文件,不太好判断,有没有人有这方面经验啊?给点思路吧。
- 总而言之,就是将一个大文件拆成若干小文件,然后多进程的对这些小文件进行处理以缩短处理时间。谢谢了
- 问题已经得到解决,现在写以下总结:
- 根据大侠们的建议我将原数据及要求重新整理如下:
- 将一个日志文件中的关键字及关键字值根据要求进行排列,以便于sqlldr入库使用,关键字值之间以逗号分隔。
- 日志中,第一种类型的日志:
- /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]
- /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]
- /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]
- 第一类日志经过处理后,需要得出如下记录:
- 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,,,,,,,,,,,,,,
- 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,,,,,,,,,,,,,,
- 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,,,,,,,,,,,,,,
- 以上数据是根据 “等号” 为基础将 左边的为字段名(变量),右边的为数值读取出后并按照之前设定好的字段顺序排列,之后生成的新文件。由于键值太多达到47个,而又不是每条日志包含所有键值,在原始日志中的排列顺序也不完全一样,所以在处理结果中我们可以看出有多个,,,,产生,其间其实为空数据,而不是人为加入的“逗号”,又由于键值中特殊字符,需要做相应处理。
- 以下为第三种类型数据,思路一样只是取得的方法更加麻烦,中括号外数据多了点,另外需要取得returns 的值。
- /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
- /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]
- /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
- 所以关键字为:$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
- 根据我的要求,在jason680不断地帮助下,最后得出以下语句:此语句根据我的要求在第一个字段加了主机名
- 由于是solaris系统,该语句只用使用该路径想的awk才能正常运行
- /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""}'
- 由于字段太多,4-44之间的多个字段我就不重复些了。
- 对于该语句有不理解的可以看一下 第30楼 jason680大侠有详细解释 ,真是太感谢了,又学到了新东西。
复制代码 |
|