免费注册 查看新帖 |

Chinaunix

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

[文本处理] 原论坛题目升华讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-08 18:19 |只看该作者 |倒序浏览
还是忍不住问问高手,在论坛找了个与这个相似的问题,但是实际用了效果不是很好。
http://bbs.chinaunix.net/thread-4098271-1-1.html
  1. [Centos@cctv]$ more 90
  2. 652        10710        WQL100        9        81x11x11        2013/9/7        10:30
  3. 702        10710        WSD120        8        18x888xx        2013/9/6        12:40
  4. 808        10710        WSP229        8        11111xxx        2013/9/6        4:50
  5. 448        10711        OPH522        7        111x1x11        2013/9/4        17:10
  6. 408        10711        TEW900        9        11x1x111        2013/9/8        10:01
  7. 602        10711        TPT100        9        11111x11        2013/9/6        23:02
  8. 213        10712        WQER39        4        1xx1x1x1        2013/9/6        11:40
  9. 213        10712        WQET39        4        11xxx1x1        2013/9/6        13:40
复制代码
  1. [Centos@cctv]$ more 91
  2. 10710        2013/9/6        11:00
  3. 10711        2013/9/7        12:00
  4. 10712        2013/9/7        11:00
复制代码
有 90 与91 两个文件。
以91文件的$1为键,将$2和$3与对应在90里面的文件进行比较:
举例:
10710        2013/9/6        11:00    ;  在90文件中找到对应行,
然后取2013/9/6        11:00 这个时间段,取这个时间段上下两行为:
702        10710        WSD120        8        18x888xx        2013/9/6        12:40
808        10710        WSP229         8        11111xxx        2013/9/6        4:50
然后再比较$5的x的个数。时间段前的x在时间段后的对应列再次出现,则记录。如

如果91里面的时间在90里面没有前后时间段。则用*表示。

期望结果:
  1. 10710        2013/9/6        11:00 2
  2. 10711        2013/9/7        12:00 0
  3. 10712        2013/9/7        11:00 *
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-04-08 19:36 |只看该作者
头痛。。。可以说说X的计算吗?
10710        2013/9/6        11:00 2
10711        2013/9/7        12:00 0
10712        2013/9/7        11:00 *
不明白为什么是2、0、*
我比较笨,不好意思

论坛徽章:
0
3 [报告]
发表于 2014-04-08 20:32 |只看该作者
本帖最后由 秋天的絮儿 于 2014-04-08 20:38 编辑

回复 2# huang6894


    你好,是我比较笨,没表达好意思》

举例:
第一个:10710        2013/9/6        11:00    2   ---> 2是如何获得的。

1.
  1. 10710        2013/9/6        11:00
复制代码
91文件中有10710这一行,取10710这行的第二列和第三列作为基准时间:2013/9/6        11:00

2. 在90文件中找到所有10710的行:
  1. 652        10710        WQL100        9        81x11x11        2013/9/7        10:30
  2. 702        10710        WSD120        8        18x888xx        2013/9/6        12:40
  3. 808        10710        WSP229        8        11111xxx        2013/9/6        4:50
复制代码
看刚才的基准时间“ 2013/9/6        11:00 ”,取这个时间点的前后两行:
  1. 702        10710        WSD120        8        18x888xx        2013/9/6        12:40
  2. 808        10710        WSP229        8        11111xxx        2013/9/6        4:50
复制代码
3. 再比较$5,时间点后的$5与时间点前的行的$5中的“x"进行比较,如果时间点前的”x"在时间点后对应位置再次出现,则记录。出现几个就记录几。
时间点前的 $5  "11111xxx" 与时间点后的$5  "18x888xx"  。时间点前最后两个“x”在时间点前的$5中再次出现,则记录为2

4. 如果91中的时间点在90文件中对应行没有时间点前或时间点后那行,则用*表示。例:
91文件中第三行:
  1. 10712        2013/9/7        11:00
复制代码
对应在90中只有时间点前,
90文件中对应10712的行如下:
  1. 213        10712        WQER39        4        1xx1x1x1        2013/9/6        11:40
  2. 213        10712        WQET39        4        11xxx1x1        2013/9/6        13:40
复制代码
所以没有办法比较。就用*表示

希望给予帮助啊!可以使用脚本来实现。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2014-04-08 23:36 |只看该作者
  1. $ awk 'function f(x,y){split(x,a,"/");split(y,b,":");return mktime(sprintf("%d %02d %02d %02d %02d %02d",a[1],a[2],a[3],b[1],b[2],0))}function g(z){gsub(/[^x]/,0,z);gsub(/x/,1,z);return z}NR==FNR{c[$2][f($6,$7)]=f($6,$7);d[$2][f($6,$7)]=$5;next}{for(i=0;i++<asort(c[$1]);)if(c[$1][i]>=f($2,$3)&&i!=1){s=g(d[$1][c[$1][i-1]])+g(d[$1][c[$1][i]]);print $0,gsub(/2/,0,s);next}print $0,"*"}' a b
  2. 10710        2013/9/6        11:00 2
  3. 10711        2013/9/7        12:00 0
  4. 10712        2013/9/7        11:00 *
复制代码
  1. $ head a b
  2. ==> a <==
  3. 652        10710        WQL100        9        81x11x11        2013/9/7        10:30
  4. 702        10710        WSD120        8        18x888xx        2013/9/6        12:40
  5. 808        10710        WSP229        8        11111xxx        2013/9/6        4:50
  6. 448        10711        OPH522        7        111x1x11        2013/9/4        17:10
  7. 408        10711        TEW900        9        11x1x111        2013/9/8        10:01
  8. 602        10711        TPT100        9        11111x11        2013/9/6        23:02
  9. 213        10712        WQER39        4        1xx1x1x1        2013/9/6        11:40
  10. 213        10712        WQET39        4        11xxx1x1        2013/9/6        13:40

  11. ==> b <==
  12. 10710        2013/9/6        11:00
  13. 10711        2013/9/7        12:00
  14. 10712        2013/9/7        11:00
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-04-09 09:03 |只看该作者
本帖最后由 秋天的絮儿 于 2014-04-09 09:04 编辑

回复 4# yestreenstars


    非常谢谢您给与答复,我不知道用什么语言表达。

在我调试过程中出现了下面的错误
  1. [Centos@cctv]$ awk 'function f(x,y){split(x,a,"/");split(y,b,":");return mktime(sprintf("%d %02d %02d %02d %02d %02d
  2. ",a[1],a[2],a[3],b[1],b[2],0))}function g(z){gsub(/[^x]/,0,z);gsub(/x/,1,z);return z}NR==FNR{c[$2][f($6,$7)]=f($6,$7);d[$2][f
  3. ($6,$7)]=$5;next}{for(i=0;i++<asort(c[$1]);)if(c[$1][i]>=f($2,$3)&&i!=1){s=g(d[$1][c[$1][i-1]])+g(d[$1][c[$1][i]]);print $0,g
  4. sub(/2/,0,s);next}print $0,"*"}' 90 91
  5. awk: function f(x,y){split(x,a,"/");split(y,b,":");return mktime(sprintf("%d %02d %02d %02d %02d %02d",a[1],a[2],a[3],b[1],b[
  6. 2],0))}function g(z){gsub(/[^x]/,0,z);gsub(/x/,1,z);return z}NR==FNR{c[$2][f($6,$7)]=f($6,$7);d[$2][f($6,$7)]=$5;next}{for(i=
  7. 0;i++<asort(c[$1]);)if(c[$1][i]>=f($2,$3)&&i!=1){s=g(d[$1][c[$1][i-1]])+g(d[$1][c[$1][i]]);print $0,gsub(/2/,0,s);next}print
  8. $0,"*"}
  9. awk:
  10.                                                                           ^ syntax error
复制代码
  1. [Centos@cctv]$ head 90 91
  2. ==> 90 <==
  3. 652        10710        WQL100        9        81x11x11        2013/9/7        10:30
  4. 702        10710        WSD120        8        18x888xx        2013/9/6        12:40
  5. 808        10710        WSP229        8        11111xxx        2013/9/6        4:50
  6. 448        10711        OPH522        7        111x1x11        2013/9/4        17:10
  7. 408        10711        TEW900        9        11x1x111        2013/9/8        10:01
  8. 602        10711        TPT100        9        11111x11        2013/9/6        23:02
  9. 213        10712        WQER39        4        1xx1x1x1        2013/9/6        11:40
  10. 213        10712        WQET39        4        11xxx1x1        2013/9/6        13:40


  11. ==> 91 <==
  12. 10710        2013/9/6        11:00
  13. 10711        2013/9/7        12:00
  14. 10712        2013/9/7        11:00
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-04-09 09:16 |只看该作者
回复 5# 秋天的絮儿

要用awk4.0以上的版本运行。
   

论坛徽章:
0
7 [报告]
发表于 2014-04-09 09:51 |只看该作者
回复 6# yestreenstars


    恩,谢谢,我的版本太低。正在下载

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
8 [报告]
发表于 2014-04-09 10:25 |只看该作者
回复 4# yestreenstars

晕写这么一行,看起来很牛,我觉的不如写成多行,该缩进缩进,该啥就啥,既美化,又易读
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2014-04-09 10:34 |只看该作者
回复 8# zhaopingzi

写成单行主要是方便调试~
   

论坛徽章:
780
金牛座
日期: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
10 [报告]
发表于 2014-04-09 10:41 |只看该作者
回复 9# yestreenstars
是的,从快速回复,帮助别人的角度看,
单行是有不少好处的;
但从代码易读、易维护,倡导良好的coding
style看,又是不好的;
取个适当的折中就可以了。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP