文本:
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
非数组版:
- 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
-
-
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打印出最后一个特征的最大值的行。非数组版只能用于特征连续的行。
数组版:
- 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) |