免费注册 查看新帖 |

Chinaunix

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

[文本处理] 怎么获得最大值和最大值所在日期之前的最小值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-23 08:04 |只看该作者 |倒序浏览
如下数据:想得到10月31至12月9之间a的最大值和b的最大值,和最大值所在日期之前的最小值
2016/10/31
1
a
39.9
2016/11/1
1
a
41.72
2016/11/2
1
a
43.06
2016/11/3
1
a
42.7
2016/11/4
1
a
46.97
2016/11/7
1
a
45.33
2016/11/8
1
a
2
2016/11/9
1
a
38.1
2016/11/10
1
a
45.3
2016/11/11
1
a
44.93
2016/11/14
1
a
45.6
2016/11/15
1
a
45.7
2016/11/16
1
a
47.49
2016/11/17
1
a
46.88
2016/11/18
1
a
46.12
2016/11/21
1
a
100
2016/11/22
1
a
46.55
2016/11/23
1
a
46.08
2016/11/24
1
a
45
2016/11/25
1
a
43.92
2016/11/28
1
a
43.4
2016/11/29
1
a
41.8
2016/11/30
1
a
42.18
2016/12/1
1
a
41.82
2016/12/2
1
a
41.35
2016/12/5
1
a
41.71
2016/12/6
1
a
42.32
2016/12/7
1
a
43.56
2016/12/8
1
a
42.98
2016/12/9
1
a
1
2016/10/31
2
b
7.36
2016/11/1
2
b
100
2016/11/2
2
b
7.32
2016/11/3
2
b
7.38
2016/11/4
2
b
7.4
2016/11/7
2
b
7.53
2016/11/8
2
b
7.49
2016/11/9
2
b
7.43
2016/11/10
2
b
7.53
2016/11/11
2
b
7.56
2016/11/14
2
b
7.53
2016/11/15
2
b
7.61
2016/11/16
2
b
7.57
2016/11/17
2
b
7.55
2016/11/18
2
b
7.56
2016/11/21
2
b
7.54
2016/11/22
2
b
7.59
2016/11/23
2
b
7.61
2016/11/24
2
b
7.55
2016/11/25
2
b
7.56
2016/11/28
2
b
7.63
2016/11/29
2
b
7.48
2016/11/30
2
b
7.42
2016/12/1
2
b
7.45
2016/12/2
2
b
7.24
2016/12/5
2
b
7.2
2016/12/6
2
b
7.19
2016/12/7
2
b
7.26
2016/12/8
2
b
7.17
2016/12/9
2
b
7.19


得到数据:
2016/11/21
1
a
45.93
2016/11/8
1
a
2
2016/11/1
2
b
100
2016/10/31
2
b
7.36


论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-09-07 06:20:00程序设计版块每日发帖之星
日期:2015-09-07 06:20:00
2 [报告]
发表于 2016-12-23 10:17 |只看该作者
  1. [root@CentOS_6 tmp]# head temp.txt
  2. 2016/10/31

  3. 1
  4.         a
  5. 39.9
  6. 2016/11/1

  7. 1
  8.         a
  9. 41.72
  10. [root@CentOS_6 tmp]# sed -i 's/\t//g' temp.txt
  11. [root@CentOS_6 tmp]# head temp.txt            
  12. 2016/10/31

  13. 1
  14. a
  15. 39.9
  16. 2016/11/1

  17. 1
  18. a
  19. 41.72
  20. [root@CentOS_6 tmp]# sed -i "/^$/d" temp.txt
  21. [root@CentOS_6 tmp]# head temp.txt         
  22. 2016/10/31
  23. 1
  24. a
  25. 39.9
  26. 2016/11/1
  27. 1
  28. a
  29. 41.72
  30. 2016/11/2
  31. 1
  32. [root@CentOS_6 tmp]# cat test.awk
  33. {
  34.   printf $0
  35.   if(NR%4==0){
  36.     printf "\n"
  37.     next
  38.   }
  39.   printf "\t"
  40. }
  41. [root@CentOS_6 tmp]# awk -f test.awk temp.txt > after_temp.txt
  42. [root@CentOS_6 tmp]# heed after_te
  43. -bash: heed: command not found
  44. [root@CentOS_6 tmp]# heed after_temp.txt
  45. -bash: heed: command not found
  46. [root@CentOS_6 tmp]# head after_temp.txt  
  47. 2016/10/31      1       a       39.9
  48. 2016/11/1       1       a       41.72
  49. 2016/11/2       1       a       43.06
  50. 2016/11/3       1       a       42.7
  51. 2016/11/4       1       a       46.97
  52. 2016/11/7       1       a       45.33
  53. 2016/11/8       1       a       2
  54. 2016/11/9       1       a       38.1
  55. 2016/11/10      1       a       45.3
  56. 2016/11/11      1       a       44.93
  57. [root@CentOS_6 tmp]# cat after_test.awk
  58. BEGIN{i=1;j=1}
  59. {
  60.   if(i==1){
  61.     a = split($0, array)
  62.         i=0
  63.         next
  64.   }
  65.   if($3==array[3]){
  66.     if($4<=array[4])
  67.       a = split($0, array)
  68.   }
  69.   else if(j==1){
  70.     b = split($0, brray)
  71.         j=0
  72.         next
  73.   }
  74.   else{
  75.     if($3==brray[3]){
  76.       if($4>=brray[4])
  77.       b = split($0, brray)
  78.     }
  79.   }
  80. }
  81. END{
  82.   for (i = 1; i <= a; ++i){
  83.     printf array[i]
  84.     printf "\t"
  85.   }
  86.   printf "\n"
  87.   for (i = 1; i <= b; ++i){
  88.     printf brray[i]
  89.     printf "\t"
  90.   }
  91.   printf "\n"
  92. }
  93. [root@CentOS_6 tmp]# awk -f after_test.awk after_temp.txt  
  94. 2016/12/9       1       a       1
  95. 2016/11/1       2       b       100
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2016-12-23 10:59 |只看该作者
本帖最后由 jason680 于 2016-12-23 11:01 编辑

回复 1# alunfirst

$ awk '{k=$3;if(t[k]>$4){t[k]=$4;u[k]=$0};if(M[k]==""){m[k]=M[k]=t[k]=$4;u[k]=a[k]=b[k]=$0;}if(M[k]<$4){if(m[k]>t[k]){m[k]=t[k];b[k]=u[k]};t[k]=M[k]=$4;a[$3]=$0}}END{for(n in a){print a[n],b[n]}}' file
2016/11/21     1     a     100      2016/11/8     1     a     2
2016/11/1     2     b     100      2016/10/31     2     b     7.36     

论坛徽章:
0
4 [报告]
发表于 2016-12-23 11:12 |只看该作者
jason680 发表于 2016-12-23 10:59
回复 1# alunfirst

$ awk '{k=$3;if(t[k]>$4){t[k]=$4;u[k]=$0};if(M[k]==""){m[k]=M[k]=t[k]=$4;u[k]= ...

好复杂,谢谢高手。

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
5 [报告]
发表于 2016-12-23 11:53 |只看该作者
回复 3# jason680

讲解下吧, 没看明白啊, 写个伪代码也行, 谢谢, 学习下

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
6 [报告]
发表于 2016-12-23 14:25 |只看该作者
本帖最后由 sunzhiguolu 于 2016-12-23 14:51 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($da, $db) = ('2016/10/31', '2016/12/9');
  5. my @aData = ();

  6. while (<DATA>){
  7.     next if ($_ lt $da or $_ gt $db);
  8.     my $pos = /a/ ? 0 : 1;
  9.     push (@{$aData[$pos]}, [split]);
  10. }

  11. foreach (@aData){
  12.     my @aT = sort {$a->[-1] <=> $b->[-1]} @$_;
  13.     my $raMax = $aT[-1];
  14.     @aT = sort {$a->[-1] <=> $b->[-1]} grep {$_->[0] =~ s/\b(?=\d\b)/0/gr lt $raMax->[0] =~ s/\b(?=\d\b)/0/gr} @aT;
  15.     print join ("\t", @{$raMax}, @{$aT[0]}), "\n";
  16. }

  17. __DATA__
  18. 2016/10/31  1   a   39.9
  19. 2016/11/1   1   a   41.72
  20. 2016/11/2   1   a   43.06
  21. 2016/11/3   1   a   42.7
  22. 2016/11/4   1   a   46.97
  23. 2016/11/7   1   a   45.33
  24. 2016/11/8   1   a   2
  25. 2016/11/9   1   a   38.1
  26. 2016/11/10  1   a   45.3
  27. 2016/11/11  1   a   44.93
  28. 2016/11/14  1   a   45.6
  29. 2016/11/15  1   a   45.7
  30. 2016/11/16  1   a   47.49
  31. 2016/11/17  1   a   46.88
  32. 2016/11/18  1   a   46.12
  33. 2016/11/21  1   a   100
  34. 2016/11/22  1   a   46.55
  35. 2016/11/23  1   a   46.08
  36. 2016/11/24  1   a   45
  37. 2016/11/25  1   a   43.92
  38. 2016/11/28  1   a   43.4
  39. 2016/11/29  1   a   41.8
  40. 2016/11/30  1   a   42.18
  41. 2016/12/1   1   a   41.82
  42. 2016/12/2   1   a   41.35
  43. 2016/12/5   1   a   41.71
  44. 2016/12/6   1   a   42.32
  45. 2016/12/7   1   a   43.56
  46. 2016/12/8   1   a   42.98
  47. 2016/12/9   1   a   1
  48. 2016/10/31  2   b   7.36
  49. 2016/11/1   2   b   100
  50. 2016/11/2   2   b   7.32
  51. 2016/11/3   2   b   7.38
  52. 2016/11/4   2   b   7.4
  53. 2016/11/7   2   b   7.53
  54. 2016/11/8   2   b   7.49
  55. 2016/11/9   2   b   7.43
  56. 2016/11/10  2   b   7.53
  57. 2016/11/11  2   b   7.56
  58. 2016/11/14  2   b   7.53
  59. 2016/11/15  2   b   7.61
  60. 2016/11/16  2   b   7.57
  61. 2016/11/17  2   b   7.55
  62. 2016/11/18  2   b   7.56
  63. 2016/11/21  2   b   7.54
  64. 2016/11/22  2   b   7.59
  65. 2016/11/23  2   b   7.61
  66. 2016/11/24  2   b   7.55
  67. 2016/11/25  2   b   7.56
  68. 2016/11/28  2   b   7.63
  69. 2016/11/29  2   b   7.48
  70. 2016/11/30  2   b   7.42
  71. 2016/12/1   2   b   7.45
  72. 2016/12/2   2   b   7.24
  73. 2016/12/5   2   b   7.2
  74. 2016/12/6   2   b   7.19
  75. 2016/12/7   2   b   7.26
  76. 2016/12/8   2   b   7.17
  77. 2016/12/9   2   b   7.19
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-12-23 14:33 |只看该作者
perl abc.pl
------------------------------------------------------------------------------------
2016/11/21      1       a       100     2016/11/8       1       a       2
2016/11/1       2       b       100     2016/10/31      2       b       7.36

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
8 [报告]
发表于 2016-12-23 15:35 |只看该作者
3楼代码明了了,学着写了一个
  1. awk '!M[$3]{M[$3]=m[$3]=$4;PM[$3]=Pm[$3]=p[$3]=$0;next}{if($4>M[$3]){M[$3]=$4;PM[$3]=$0;Pm[$3]=p[$3]}else if($4<M[$3]){if($4<m[$3]){m[$3]=$4;p[$3]=$0}}}END{for(i in M)print PM[i]"\t"Pm[i]}'
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
9 [报告]
发表于 2016-12-23 20:54 |只看该作者
本帖最后由 moperyblue 于 2016-12-23 20:59 编辑

日期是不是已经排序?
  1. awk '{x=mktime(gensub("/",FS,"g",$1)" 0 0 0");k=$3}NR==FNR{if($4>a[k]){a[k]=$4;max[k]=$0;b[k]=x};next}x<b[k]{if(!c[k]||$4<c[k]){c[k]=$4;min[k]=$0}}END{for(i in a)print max[i]"\t"min[i]}' file file
复制代码

论坛徽章:
0
10 [报告]
发表于 2016-12-25 16:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP