Chinaunix

标题: 怎么取每月最晚的日期呢? [打印本页]

作者: alunfirst    时间: 2016-11-13 12:37
标题: 怎么取每月最晚的日期呢?
数据:
2015/1/20
2015/1/21
2015/1/22
2015/1/23
2015/2/11
2015/2/12
2015/2/13
2015/2/14


想得到:

2015/1/23
2015/2/14


作者: sunzhiguolu    时间: 2016-11-13 13:48
回复 1# alunfirst
你这个是顺序的日期吗?


作者: zy86416779    时间: 2016-11-13 19:18
  1. [root@CentOS_6 tmp]# cat 1.txt
  2. 2015/1/20
  3. 2015/1/23
  4. 2015/1/22
  5. 2015/2/14
  6. 2015/2/11
  7. 2015/1/21
  8. 2015/2/12
  9. 2015/2/13
  10. [root@CentOS_6 tmp]# cat 1.awk
  11. /\/1\//{
  12.   if($0>a[1]){
  13.     a[1]=$0
  14.   }
  15.   next
  16. }
  17. /\/2\//{
  18.   if($0>a[2]){
  19.     a[2]=$0
  20.   }
  21.   next
  22. }
  23. END{print a[1]; print a[2]}
  24. [root@CentOS_6 tmp]# awk -f 1.awk 1.txt
  25. 2015/1/23
  26. 2015/2/14
复制代码

作者: moperyblue    时间: 2016-11-13 20:18

  1. awk -F/ '{a[$1$2]=$0>a[$1$2]?$0:a[$1$2]}END{for(i in a)print a[i]}' file
复制代码

作者: jcdiy0601    时间: 2016-11-14 09:21
  1. cat file |sort -n -t / -k 2|awk 'BEGIN{FS=OFS="/"}{a[$1OFS$2]=$3}END{for(i in a)print i,a[i]}'
复制代码

作者: alunfirst    时间: 2016-11-14 14:08
moperyblue 发表于 2016-11-13 20:18

谢谢高手~~~~~~~~~

作者: fh21_xuejinlian    时间: 2016-11-14 17:35
awk -F'/' '{$3>a[$1FS$2]?a[$1FS$2]=$3:a[$1FS$2]=a[$1FS$2]}END{for(i in a)print i"/"a[i]}' file
作者: LIerWx    时间: 2016-11-15 10:24
  1. cat file |awk 'BEGIN{FS=OFS="/"}{a[$1OFS$2]=$3}END{for(i in a)print i,a[i]}'
复制代码

简化5楼的
作者: 本友会机友会摄友会    时间: 2016-11-16 18:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: yebailin    时间: 2016-11-17 09:53
回复 4# moperyblue

awk -F/ '{a[$1$2]=$0>a[$1$2]?$0:a[$1$2]}END{for(i in a)print a}'

这个优先级是怎么看啊   a[$1$2]=          $0>a[$1$2]?$0:a[$1$2]   这样么? 取大的 赋值给a[],=号优先级最低?

网上搜的,不知道对不对
awk 的数值运算符( 优先级由大到小排列) 运算符                   说明
  ++ --                    增加与减少( 前置或后置)
  ^ **                     指数( 右结合性)
  ! + -                     非、一元(unary) 加号、一元减号
  * / %                    乘、除、余数
  + -                      加、减
< <= == != > >=           比较
&&                         逻辑AND( 简写)
||                        逻辑OR( 简写)
?:                        三元条件式
= += -= *= /= %= ^= **=      赋值( 右结合性)


作者: moperyblue    时间: 2016-11-17 10:21
回复 10# yebailin


a[$1$2]=$0>a[$1$2]?$0:a[$1$2]

<=>

if($0>a[$1$2]){
    a[$1$2]=$0
}else{
    a[$1$2]=a[$1$2]
}

可以是这样
  1. awk -F/ '$0>a[$1$2]{a[$1$2]=$0}END{for(i in a)print a[i]}'
复制代码

作者: sditmaner    时间: 2016-11-17 12:47
真是难得给力的帖子啊

作者: 聆雨淋夜    时间: 2016-11-17 13:12
  1. #/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import sys,fileinput,re
  4. dict1={}
  5. for line in fileinput.input(sys.argv[1:]):
  6.         x= re.split("/",line.strip("\n"))
  7.         key='/'.join(x[:-1])
  8.         if  key not in dict1:
  9.                 dict1[key]=x[2:]
  10.         else:
  11.                 dict1[key].append(x[2])

  12. for key,value in dict1.items():
  13.         print key+"/"+max(value)
复制代码
$ python test.py file
2015/2/14
2015/1/23
作者: 关阴月飞    时间: 2016-11-18 11:06
  1. sort -t / -k2n -k3nr urfile |awk -F/ '!a[$2]++'
复制代码

作者: sunzhiguolu    时间: 2016-11-18 15:33
本帖最后由 sunzhiguolu 于 2016-11-18 15:39 编辑
  1. perl -0pe 'BEGIN{$N=qr/\N*/;$n=qr/$N\n/;}{s!^(?:($N)/$n)(\1$n)*!$2!gm}' f
复制代码

作者: moperyblue    时间: 2016-11-18 15:47

  1. sort -t/ -k1n -k2n -k3nr file|awk -F/ '!a[$1$2]++'
  2. sort -t/ -k1n -k2n -k3n file|sed -r 'N;\#((.+/){2}).*\n\1#!P;D'
复制代码

作者: MClhuang    时间: 2016-11-22 16:59
回复 4# moperyblue

大神,这里的>具体比较的什么呢?按照道理说应该a[$1$2]已经被赋值=$0了

作者: moperyblue    时间: 2016-11-22 17:12
回复 17# MClhuang


a[$1$2]保存的是每组中值最大的那条记录




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2