Chinaunix

标题: 求按照第二列取前2条记录的shell [打印本页]

作者: zkg510168343    时间: 2016-02-02 13:59
标题: 求按照第二列取前2条记录的shell
文件内容:
2016-01-01 123
2016-01-01 456
2016-01-01 789
2016-01-02 123
2016-01-02 456
2016-01-02 789
2016-01-03 123
2016-01-03 456
2016-01-03 789
2016-01-04 123
2016-01-04 456
2016-01-04 789
2016-01-05 123
2016-01-05 456
2016-01-05 789

现在想根据第二列分组获取最新的前两条记录 注:第二列是user_id,也就是获取每个用户最新的两条记录,希望结果如下:
2016-01-05 123
2016-01-05 456
2016-01-05 789
2016-01-04 123
2016-01-04 456
2016-01-04 789
求救这个shell应该怎么写?各位大神帮帮忙,研究好久了
作者: radish1027    时间: 2016-02-02 14:27
user_id是固定的那些数字?还是随机的?最新是什么意思,是排在最上面?还是数字最小?
作者: haooooaaa    时间: 2016-02-02 14:35
  1. awk '{a[$2][2]=a[$2][1];a[$2][1]=$1}END{for(i=1;i<=2;i++)for(j in a)print a[j][i],j}' file
  2. 2016-01-05 123
  3. 2016-01-05 456
  4. 2016-01-05 789
  5. 2016-01-04 123
  6. 2016-01-04 456
  7. 2016-01-04 789
复制代码
gawk 4
作者: jason680    时间: 2016-02-02 14:45
回复 1# zkg510168343

$ awk '{d[$2,++a[$2]%2]=$0}END{t=asort(d);for(n=t;n>0;--n)print d[n]}' FILE
2016-01-05 789
2016-01-05 456
2016-01-05 123
2016-01-04 789
2016-01-04 456
2016-01-04 123
   

作者: zxy877298415    时间: 2016-02-02 14:58
本帖最后由 zxy877298415 于 2016-02-02 15:00 编辑
  1. awk '{if(a[$2]) {a[$2]=$1} if(a[$2]<$1) {a[$2]=$1} b[$2]=b[$2]?b[$2]" "$1:$1}END{for(i in a) {print a[i],i;t=split(b[i],c," "); for(j=1;j<=t;j++) {if(c[j]>k&&c[j]!=a[i]) {s=c[j]}} print s,i}}' file
复制代码
回复 1# zkg510168343


   
作者: zkg510168343    时间: 2016-02-02 15:08
回复 3# haooooaaa
非常感谢,虽然我测试的时候提示语法错误,但是应该是我的版本问题

   
作者: zkg510168343    时间: 2016-02-02 15:09
回复 4# jason680
按照你的方法果然可以了,非常感谢,确实我的问题没有描述清楚,谢谢,两位的代码我已经收藏,非常经典


   
作者: LikeLx    时间: 2016-02-03 09:17
  1. awk 'a[$2]{b[$2]=a[$2]"\n"$0}{a[$2]=$0}END{for(i in b)print b[i]}'
复制代码





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