Chinaunix

标题: 如何对身份证号码进行排序,按照年月大小排序。 [打印本页]

作者: LikeLx    时间: 2013-10-23 09:00
标题: 如何对身份证号码进行排序,按照年月大小排序。
本帖最后由 LikeLx 于 2013-10-23 09:23 编辑

对身份证号码进行排序,按照年月大小排序。(按照标红部分排序)

232332198510160913
232332199007130125
340403198208111312
350783198605193316
370683198403084132
500234198501216453
622421198309052213


作者: LikeLx    时间: 2013-10-23 09:03
本帖最后由 LikeLx 于 2013-10-23 09:24 编辑

试了好几个方法不对,求大神指教下!
作者: yestreenstars    时间: 2013-10-23 09:31
  1. [root@localhost ~]# cat i
  2. 232332198510160913
  3. 232332199007130125
  4. 340403198208111312
  5. 350783198605193316
  6. 370683198403084132
  7. 500234198501216453
  8. 622421198309052213
  9. [root@localhost ~]# sort -nk1.7,1.14 i
  10. 340403198208111312
  11. 622421198309052213
  12. 370683198403084132
  13. 500234198501216453
  14. 232332198510160913
  15. 350783198605193316
  16. 232332199007130125
  17. [root@localhost ~]#
复制代码

作者: LikeLx    时间: 2013-10-23 09:34
回复 3# yestreenstars
多谢,请问用awk可以弄出来吗?

   
作者: reyleon    时间: 2013-10-23 09:45
回复 4# LikeLx
  1. awk '{a[substr($0,7,8)]=$0}END{for(i=1;i<=asorti(a,b);i++)print a[b[i]]}'
复制代码

作者: yestreenstars    时间: 2013-10-23 09:47
本帖最后由 yestreenstars 于 2013-10-23 09:48 编辑
  1. [root@localhost ~]# cat i
  2. 232332198510160913
  3. 232332199007130125
  4. 340403198208111312
  5. 350783198605193316
  6. 370683198403084132
  7. 500234198501216453
  8. 622421198309052213
  9. [root@localhost ~]# awk '{a[substr($0,7,8)]=$0}END{for(i=1;i<=asorti(a,b);i++)print a[b[i]]}' i
  10. 340403198208111312
  11. 622421198309052213
  12. 370683198403084132
  13. 500234198501216453
  14. 232332198510160913
  15. 350783198605193316
  16. 232332199007130125
  17. [root@localhost ~]#
复制代码

作者: LikeLx    时间: 2013-10-23 09:50
回复 5# reyleon

多谢
   
作者: LikeLx    时间: 2013-10-23 09:50
回复 6# yestreenstars

多谢
   
作者: LikeLx    时间: 2013-10-23 11:21
awk '{a[substr($0,7,]=$0;c[substr($0,7,4)]++}END{for(i=1;i<=asorti(a,b);i++) print a[b[i]];for(i in c) print i,c[i]|"sort -n"}' 多谢各位的帮助,自己又添了点东西
作者: davidbeckham921    时间: 2013-10-23 15:43
本帖最后由 davidbeckham921 于 2013-10-23 15:48 编辑

楼上几位的方法很好,但是如果有年与日相等的情况肿么办呢?数组是不是就。。。了

232332198510160913
333333198510160913
232332199007130125
340403198208111312
350783198605193316
370683198403084132
500234198501216453
622421198309052213

好像还是用sort好些

sort -nk1.7,1.14 i|wc -l
8
gawk '{a[substr($0,7,]=$0}END{for(i=1;i<=asorti(a,b);i++)print a[b]}' i|wc -l
7
作者: LikeLx    时间: 2013-10-23 16:03
回复 10# davidbeckham921
那就把后四位再带上,确保不会重复。

   
作者: davidbeckham921    时间: 2013-10-23 16:42
LikeLx 发表于 2013-10-23 16:03
回复 10# davidbeckham921
那就把后四位再带上,确保不会重复。


不知道有特殊字符,比如x的会咋样。后四位也不能完全保证一致吧。搞个二维数组应该可以搞定。前面是a[$0],后面搞个a[$0]++。感觉应该还是sort专业
作者: seesea2517    时间: 2013-10-24 09:40
回复 12# davidbeckham921


    或者这样,把身份证的前七位移到最后去,这样所有的身份证号码没改变,只是变了一下顺序,变成了年月日在最前面了,以最高的优先级排列了。
作者: 423497786    时间: 2014-01-13 17:37
awk '{print substr($0,7,|"sort"}' 1.txt




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