Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3031925
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-10-12 16:02:57

文本:
FFF;2011-10-1;2011-10-1 0:00 ;4.57389
FFF;2011-10-1;2011-10-1 0:15 ;4.33278
FFF;2011-10-2;2011-10-2 12:45;5.95446
FFF;2011-10-2;2011-10-2 15:00;6.21554
FFF;2011-10-3;2011-10-3 16:15;6.11111
FFF;2011-10-3;2011-10-3 14:45;6.21334
FFF;2011-10-3;2011-10-3 20:15;5.95223
FFF;2011-10-3;2011-10-3 8:30 ;4.05778

要求分号为分割符,以第1和第2个字段为特征,输出第5字段最大值的行:
FFF;2011-10-1;2011-10-1 0:00 ;4.57389
FFF;2011-10-2;2011-10-2 15:00;6.21554
FFF;2011-10-3;2011-10-3 14:45;6.21334

非数组版:
  1. awk -F";" 'NR>1{if($1$2==x){if($4>y)z=$0;else next}else{print z}}{x=$1$2;y=$4;z=$0}END{print z}' file

  2. awk -F';' '{if($1$2==x){if($4>y)z=$0;else next}else{if(NR>1)print z};x=$1$2;y=$4;z=$0}' file <(echo)
[解析]
有点头疼吧,仔细分析。首先不满足 NR>1 执行后面语句把第一行的第1,2字段,第4字段和全行,赋给变量x y z,到第二行时满足NR>1的条件,执行里面的语句,判断第2行是否和第1行是同样特征,如果是的话接着判断 $4 是否大于第一行的值,如果条件为真则把这行的全行内容赋值给变量z,如果不成功的话就不再执行后面的任何语句,等于还是保持的上一行的值(暂时是最大值),如果不满满足特征的话就直接打印上一行的内容,就这样逐行比较,发现当前行的特征不上一样不同时,就打印出前面最大的值的那一行,最后END打印出最后一个特征的最大值的行。非数组版只能用于特征连续的行



数组版:
  1. awk -F";" '{i=$1$2;if(a[i]<$4){a[i]=$4;b[i]=$0}}END{for(j=1;j<=asorti(a,c);j++)print b[c[j]]}' file
[解析]
以第1,2个字段为特征,如果数组a的值(数组a就是保存的每个特征的第4字段的值)小于前面同特征的值就把新的值赋给数组a,并把该行保存到数组b中,这样数组b就是保存的最大值的行了,最后用asorti排序(对数组下标排序),这样就会按日期大小输出最大行的内容。数组版可以用于特征交叉的行。




阅读(5740) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

llsnnu2014-03-17 11:43:51

要是遇到最大数有几个重复的会怎么样呢,sort+awk是不是就不行了

llsnnu2014-03-17 11:43:05

学习了

yinyuemi2011-10-13 01:42:05

sort -t\; -k1,1 -k2,2 -k4,4nr file |awk -F\; '!a[$1$2]++'