免费注册 查看新帖 |

Chinaunix

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

二维数组文件处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-27 10:52 |只看该作者 |倒序浏览
不会用shell做计算,所以想到用python来处理一个文件,我纯新手但是模仿很快

我需要解决的几个问题
> 将一个文件的数据读入
> 对列进行可读性处理,删除不必要的信息
> 基于一个值进行计算

  1. #原始文件格式:
  2. Server03        1        936914594        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        6        ;
  3. Server03        3        936914596        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        5        ;
  4. ...
  5. 非常长的文件
复制代码
第一列服务器,第二列表示什么服务,第三列话单好, 第四列我只需要1986<>f 中间那部分,那部分是个手机号, 5列需要去除f是imsi号,6列是时间需要去除2b0800, 接下来两列是上下行流量,最后一列是标示号

我可能需要做的计算,
1 统计服务1的所有上下行流量
2 统计单个手机上下行的流量

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2014-11-27 12:09 |只看该作者
结果输出要如何展示?

也就是说, 你要什么结果吧...

一般的提问:

1. 原始文本
2. 需求以及说明
3. 目标文本

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2014-11-27 12:19 |只看该作者
目测一下吧:
  1. [root@localhost ~]# cat file
  2. Server03        1        936914594        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        6        ;
  3. Server03        3        936914596        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        5        ;
  4. [root@localhost ~]#
  5. [root@localhost ~]# awk '{k=$1"\t"$2;a[k]+=$(NF-3);b[k]+=$(NF-2);p=substr($4,5,11);c[p]+=$(NF-3);d[p]+=$(NF-2)}END{for(i in a)print i,"up:"a[i],"down:"b[i];for(i in c)print i,"up:"c[i],"down:"d[i]}' file
  6. Server03        1 up:4158 down:6076
  7. Server03        3 up:4158 down:6076
  8. 18649901541 up:8316 down:12152
  9. [root@localhost ~]#
  10. [root@localhost ~]#
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-11-27 12:37 |只看该作者
谢谢,我主要是不知道怎么做加法

主要需求是做加法

1>
就是基于server的
server01  UP:XXXX down:XXXX
server03  UP:XXXX down:XXXX
2> 统计基于手机号的流量
xxxxxxx up:xxx down:xxx
xxxxxxx up:xxx down:xxx
3> 统计基于服务的流量
服务1 UP:    down:
服务2 UP:    down:
4> 统计基于时间的流浪:
14110301~14110302 UP:  down:
14110302~14110303 UP:  down:


回复 3# reyleon


   

论坛徽章:
0
5 [报告]
发表于 2014-11-27 12:57 |只看该作者
谢谢啊,另外要问的一个是

  1. awk '
  2.                   {k=$1"\t"$2;
  3.        a[k]+=$(NF-3);
  4.        b[k]+=$(NF-2);
  5.        p=substr($4,5,11);
  6.        c[p]+=$(NF-3);
  7.        d[p]+=$(NF-2)}
  8.        END
  9.        {for(i in a)print i,  
  10. #为什么是在a中穷举啊,这个我不能理解, 不是应该是所有的k么
  11.        "up:"a[i],"down:"b[i];
  12.        for(i in c)print i,
  13. #同上
  14.        "up:"c[i],"down:"d[i]}
  15.       
  16.        ' file
复制代码
回复 3# reyleon


   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
6 [报告]
发表于 2014-11-27 13:24 |只看该作者
你照猫画虎就对了

论坛徽章:
3
天秤座
日期:2014-10-29 11:37:572015元宵节徽章
日期:2015-03-06 15:50:39NBA常规赛纪念章
日期:2015-05-04 22:32:03
7 [报告]
发表于 2014-11-27 14:42 |只看该作者
本帖最后由 tomer 于 2014-11-27 14:46 编辑

  1. [root@VM ~]# more 11.txt
  2. Server03        1        936914594        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        6        ;
  3. Server03        3        936914596        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        5        ;
  4. Server01        3        936914596        198618649901541f        460019906205067f        1411040000442b0800        4158        6076        5        ;
复制代码

  1. [root@VM ~]# more tjlj.py
  2. #!/usr/bin/python
  3. import sys
  4. import re
  5. import string
  6. if len(sys.argv) < 3:
  7.   print("usage:",sys.argv[0],"filename servernumber")
  8.   sys.exit()
  9. up=0
  10. down=0
  11. f=open(sys.argv[1],"r")
  12. for i in f:
  13.   arr=i.split()
  14.   if sys.argv[2]==arr[1]:
  15.       up+=float(arr[6])
  16.       down+=float(arr[7])   
  17. print("servernumber",sys.argv[2],"upflow is:",up)
  18. print("servernumber",sys.argv[2],"downflow is:",down)
  19. f.close()
复制代码

  1. [root@VM ~]# ./tjlj.py 11.txt 3                                   
  2. servernumber 3 upflow is: 8316.0
  3. servernumber 3 downflow is: 12152.0
复制代码

论坛徽章:
3
天秤座
日期:2014-10-29 11:37:572015元宵节徽章
日期:2015-03-06 15:50:39NBA常规赛纪念章
日期:2015-05-04 22:32:03
8 [报告]
发表于 2014-11-27 15:09 |只看该作者
本帖最后由 tomer 于 2014-11-27 16:41 编辑

  1. #!/usr/bin/python
  2. import sys
  3. import re
  4. import string
  5. if len(sys.argv) < 3:
  6.   print("usage:",sys.argv[0],"filename phonenumber")
  7.   sys.exit()
  8. up=0
  9. down=0
  10. f=open(sys.argv[1],"r")
  11. for i in f:
  12.   arr=i.split()
  13.   phnumber=re.findall(r'(?<=1986).*(?=f)',arr[3])
  14.   if sys.argv[2]==phnumber[0]:
  15.       up+=float(arr[6])
  16.       down+=float(arr[7])
  17. print("phonenumber",sys.argv[2],"downflow is:%f, upflow is:%f" %(down,up))
  18. f.close()
  19. ~        
复制代码

  1. [root@VM ~]# ./phonelj.py 11.txt 18649901541
  2. phonenumber 18649901541 downflow is:18228.000000, upflow is:12474.000000
复制代码

论坛徽章:
3
天秤座
日期:2014-10-29 11:37:572015元宵节徽章
日期:2015-03-06 15:50:39NBA常规赛纪念章
日期:2015-05-04 22:32:03
9 [报告]
发表于 2014-11-27 16:35 |只看该作者
别的同理,改改就行了

论坛徽章:
0
10 [报告]
发表于 2014-11-27 20:45 |只看该作者
我开始步骤做的

第一步过滤出来有用的信息,大概花了30分钟,得到三个文件

  1. /var/opt/BGw/ServerGroup1/Server1/BGwTTStorage/GPRS/cdrst/te/result/Koo# ls -ltr
  2. total 7284998
  3. -rw-r--r--   1 root     root     1191301377 Nov 27 14:20 GGSN02_1.log
  4. -rw-r--r--   1 root     root     1296238632 Nov 27 14:22 GGSN01_1.log
  5. -rw-r--r--   1 root     root     1242347819 Nov 27 14:22 GGSN03_1.log
  6. -rwxr-xr-x   1 root     root          81 Nov 27 20:02 sta.sh

  7. #数据格式
  8. /var/opt/BGw/ServerGroup1/Server1/BGwTTStorage/GPRS/cdrst/te/result/Koo# head GGSN02_1.log
  9. server02 2 18629858348 141104120830 8013 7077
  10. server02 1 13134460511 141104120631 0 0
  11. server02 2 13039305885 141104121012 16622 16810
  12. server02 2 15504487151 141104121036 709 794
  13. server02 2 13214358761 141104121023 125 480
  14. server02 2 13244245190 141104111116 48634 74515
  15. server02 2 13214358761 141104121116 193 707
  16. server02 2 13278423411 141104121112 127 601
复制代码
然后第二步骤

  1. /var/opt/BGw/ServerGroup1/Server1/BGwTTStorage/GPRS/cdrst/te/result/Koo# vi all.sh
  2. "all.sh" [New file]
  3. awk '{p=$3;c[p]+=$5;d[p]+=$6}END{for(i in c)print i,"uplink:"c[i],"downlink:"d[i]}' *.log > sum
  4. ~

  5. ~
  6. "all.sh" [New file] 1 line, 96 characters
  7. /var/opt/BGw/ServerGroup1/Server1/BGwTTStorage/GPRS/cdrst/te/result/Koo# chmod 755 all.sh

  8. /var/opt/BGw/ServerGroup1/Server1/BGwTTStorage/GPRS/cdrst/te/result/Koo#nohup ./all.sh &
复制代码
问题来了结果跑了5个小时没出来结果

回复 6# reyleon


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP