免费注册 查看新帖 |

Chinaunix

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

[文本处理] 无线基站在线时长更新问题 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-29 05:30 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-06-30 12:23 编辑

大家好,我有一个问题向大家请教:
有一些移动设备UE,在连接到无线基站ENB之后,每隔5分钟会向核心网Linux服务器发送以下格式的状态数据:
假设编号为3424的UE的状态文件名为ue3424.upd,内容如下:
  1. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
复制代码
其中最后的[45/3129]的定义为[max_enb:max_ue],意思是移动设备UE3424在当前基站ENB1001保持连接了45个周期,
也就是45x5=225分钟;而该UE3424已经开机3129个周期,也就是3129x5=15645分钟。
现在我想统计无线基站ENB的最大在线时长,也就是根据各个UE的状态数据,来产生一个enb.max文件。
例如上述UE3424,检查enb.max文件,如果该文件中没有enb1001的内容,则把自身的状态信息添加到enb.max中,并按max_enb的大小进行排序;
如果该文件中已经有enb1001的内容,则根据max_enb的大小,如果当前UE的状态数据中的max_enb大于enb.max文件中的enb1001的max_enb值,
则把UE的状态数据更新到enb.max文件中并按max_enb的大小进行排序;否则则不做任何操作。

举例如下:
假如enb.max内容如下:

  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
复制代码
这时UE3424发现该文件中没有enb1001的记录,则直接把自己的状态数据加入到该文件中并按max_enb值从大到小的顺序(74>45>3)排序。
2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
这样enb.max的内容应该变成
  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
  3. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
复制代码
假如之后有一个UE8342的状态如下:
2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
由于该UE8342连接enb5303的max_enb值为53,大于enb.max文件中的enb5303的值3,所以UE8342会将自身的状态数据替换enb.max中enb5303那条记录并按max_enb值从大到小的顺序(74>53>45)排序。
  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
  3. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2014-06-29 07:00 |只看该作者
不明觉厉

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2014-06-29 09:11 |只看该作者
好专业啊,期待有耐心的大神帮楼主解答。

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
4 [报告]
发表于 2014-06-29 11:35 |只看该作者
背景介绍这么长。。。只要提取个文本的模型讲讲就好了吧。。说的太玄乎了不好…………

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-06-30 08:51 |只看该作者
本帖最后由 Herowinter 于 2014-06-30 08:56 编辑

回复 [url=forum.php?mod=redirect&goto=find
post&pid=&ptid=4143887]1#[/url] bikkuri


问一个问题, enb.max的初始状态肯定是有序的吗?

好吧,这问题有点傻,给的例子里面是从小到大的,
期望结果是从大到小的,那意味每次都是重新排序
所有记录而不是把新记录插到合适的位置?

   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2014-06-30 09:44 |只看该作者
您说的有道理。我已经改过来了。
enb.max的初始状态肯定是按max_enb排序的。

Herowinter 发表于 2014-06-30 08:51
回复 1# bikkuri

问一个问题, enb.max的初始状态肯定是有序的吗?

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
7 [报告]
发表于 2014-06-30 10:38 |只看该作者
回复 6# bikkuri
开是enb.max不保证有序,每次插入都重新排序的写好了。
  1. #!/bin/bash

  2. function upd_enbmax(){
  3. awk '
  4.     function bubble_sort(record,val,n){
  5.         for(i=1;i<n;i++)
  6.             for(j=n;j>i;j--)
  7.                 if(val[i]<val[j]){
  8.                     temp=val[i]
  9.                     val[i]=val[j]
  10.                     val[j]=temp
  11.                     temp=record[i]
  12.                     record[i]=record[j]
  13.                     record[j]=temp
  14.                 }        
  15.     }
  16.    
  17.     NR==FNR{
  18.         ++m
  19.         upd_enb[m]=$6
  20.         upd_record[m]=$0
  21.         upd_val[m]=gensub(/\[([0-9]+).*/,"\\1",1,$NF)
  22.         next
  23.     }
  24.    
  25.     {
  26.         ++n
  27.         enb[n]=$6
  28.         record[n]=$0
  29.         val[n]=gensub(/\[([0-9]+).*/,"\\1",1,$NF)
  30.     }
  31.    
  32.     END{
  33.         for(i=1;i<=m;i++){
  34.             found=0
  35.             for(j=1;j<=n;j++){
  36.                 if(upd_enb[i]==enb[j]){
  37.                     record[j]=upd_record[i]
  38.                     val[j]=upd_val[i]
  39.                     found=1
  40.                     break
  41.                 }
  42.             }
  43.             if(!found){
  44.                 ++n
  45.                 record[n]=upd_record[i]
  46.                 val[n]=upd_val[i]
  47.             }
  48.             
  49.         }
  50.             
  51.         bubble_sort(record,val,n)
  52.         for(i=1;i<=n;i++)
  53.             print record[i]      
  54.     }
  55.     ' $1 $2
  56. }

  57. upd_enbmax ue3424.upd enb.max
  58. echo "###Anthoer update call###"
  59. upd_enbmax ue8342.upd enb.max
复制代码
  1. cat ue3424.upd
  2. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]

  3. cat ue8342.upd
  4. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]

  5. cat enb.max
  6. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
  7. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
复制代码
结果
  1. ./test.sh
  2. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  3. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
  4. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
  5. ###Anthoer update call###
  6. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  7. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
复制代码

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-06-30 10:48 |只看该作者
回复 6# bikkuri
可能写得复杂了点,若实际情况ue3424.upd这种文件里
只有一行记录的话,写代码会简单很多,只需要一个变量
来保存而不是数组了,后面循环也可以少一层。

   

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
9 [报告]
发表于 2014-06-30 11:31 |只看该作者
回复 6# bikkuri
若满足下面两个条件可以用这个简化很多的脚本,
根本不需要排序,找到合适位置插入或更新即可。
(1) enb.max初始已有序
(2) 每个ue3424.upd只包含一行记录
  1. #!/bin/bash

  2. function upd_enbmax(){
  3. awk '
  4.       
  5.     NR==FNR{
  6.         upd_enb=$6
  7.         upd_record=$0
  8.         upd_val=gensub(/\[([0-9]+).*/,"\\1",1,$NF)
  9.         next
  10.     }
  11.    
  12.     !found && gensub(/\[([0-9]+).*/,"\\1",1,$NF)<upd_val{
  13.         print upd_record
  14.         found=1
  15.         if($6==upd_enb)
  16.             next
  17.     }
  18.    
  19.     1
  20.     ' $1 $2
  21. }

  22. upd_enbmax ue3424.upd enb.max
  23. echo "###Anthoer update call###"
  24. upd_enbmax ue8342.upd enb.max
复制代码
  1. ./test1.sh
  2. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  3. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
  4. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
  5. ###Anthoer update call###
  6. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  7. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2014-06-30 12:00 |只看该作者
本帖最后由 bikkuri 于 2014-06-30 12:40 编辑

谢谢您的答复。
这两个条件都满足的。

但是您的程序好像并没有直接更新enb.max文件而是把更新的结果输出到屏幕?
另外,如果在碰到enb.max文件的内容为:
  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
  3. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
复制代码
而UE8342的状态为:
  1. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
复制代码
的时候,则不但需要把UE8342的状态信息插入到enb.max文件的第二行,而且需要把enb.max最后一行的原记录删除。
变成:
  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
  3. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
复制代码
您的程序在做插入新记录的动作的时候,好像还少了一个删除旧记录的动作。

我刚才试了一下您的程序,得到的结果是:
  1. 2014-06-29 04:36:08 1403987768 sgw02 ue9564 enb3902 [0/5] [74/4382]
  2. 2014-06-29 05:11:06 1403989866 sgw02 ue8342 enb5303 [0/2] [53/535]
  3. 2014-06-29 04:41:07 1403988067 sgw01 ue3424 enb1001 [0/3] [45/3129]
  4. 2014-06-29 04:21:03 1403986863 sgw02 ue5453 enb5303 [2/6] [3/852]
复制代码
Herowinter 发表于 2014-06-30 11:31
回复 6# bikkuri
若满足下面两个条件可以用这个简化很多的脚本,
根本不需要排序,找到合适位置插入或更 ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP