Chinaunix

标题: 关于门禁刷卡记录的精简处理 [打印本页]

作者: flymeteor    时间: 2007-08-08 17:23
标题: 关于门禁刷卡记录的精简处理
现在有一份门禁刷卡记录的文件,大致格式如下。现在需要对文件进行处理,保留每天每个人最早和最晚的一条记录,精简出每人的出勤情况,不知用shell如何实现,谢谢!
------------------------------------------------------------------------------------------------------------------------
2007-7-10 11:08:49        门禁接受: 读卡器                R27-26                207         王五
2007-7-10 8:34:48        门禁接受: 读卡器                R23-27                207         王五
2007-7-10 9:05:02        门禁接受: 读卡器                R23-27                207         王五
2007-7-10 9:38:53        门禁接受: 读卡器                R23-34                207         王五
2007-7-10 9:41:26        门禁接受: 读卡器                R23-33                207         王五
2007-7-11 10:05:19        门禁接受: 读卡器                R23-28                207         王五
2007-7-11 9:54:24        门禁接受: 读卡器                R26-19                207         王五
2007-7-11 9:54:41        门禁接受: 读卡器                R26-19                207         王五
2007-7-11 9:54:41        门禁接受: 读卡器                R26-20                207         王五
2007-7-11 9:54:57        门禁接受: 读卡器                R26--16                207         王五
2007-7-11 9:56:34        门禁接受: 读卡器                R23-27                207         王五
2007-7-12 10:27:11        门禁接受: 读卡器                R23-27                207         王五
2007-7-12 8:55:51        门禁接受: 读卡器                R27-26                207         王五
2007-7-12 8:56:19        门禁接受: 读卡器                R27-25                207         王五
2007-7-12 8:57:01        门禁接受: 读卡器                R27-26                207         王五
2007-7-12 9:08:20        门禁接受: 读卡器                R27-25                207         王五
2007-7-13 11:16:21        门禁接受: 读卡器                R26-31                207         王五
2007-7-13 11:19:07        门禁接受: 读卡器                R23-27                207         王五
2007-7-13 9:30:18        门禁接受: 读卡器                R23-41                207         王五
2007-7-13 9:30:51        门禁接受: 读卡器                R23-27                207         王五
2007-7-13 9:56:08        门禁接受: 读卡器                R23-24                207         王五
2007-7-10 10:35:52        门禁接受: 读卡器                R23-35                410         张三
2007-7-10 17:38:18        门禁接受: 读卡器                R23-47                410         张三
2007-7-10 8:50:19        门禁接受: 读卡器                R23-48                410         张三
2007-7-10 8:50:26        门禁接受: 读卡器                R23-36                410         张三
2007-7-11 12:21:44        门禁接受: 读卡器                R23-35                410         张三
2007-7-11 9:28:00        门禁接受: 读卡器                R23-33                410         张三
2007-7-11 9:33:33        门禁接受: 读卡器                R23-33                410         张三
2007-7-11 9:35:03        门禁接受: 读卡器                R23-34                410         张三
2007-7-11 9:44:59        门禁接受: 读卡器                R23-33                410         张三
2007-7-12 10:27:00        门禁接受: 读卡器                R23-35                410         张三
2007-7-12 10:27:05        门禁接受: 读卡器                R23-47                410         张三
2007-7-12 9:43:03        门禁接受: 读卡器                R25-31                410         张三
2007-7-12 9:44:01        门禁接受: 读卡器                R23-48                410         张三
2007-7-12 9:44:08        门禁接受: 读卡器                R23-36                410         张三
2007-7-12 9:45:10        门禁接受: 读卡器                R23-33                410         张三
2007-7-13 10:24:46        门禁接受: 读卡器                R23-35                410         张三
2007-7-13 10:24:54        门禁接受: 读卡器                R23-47                410         张三
2007-7-13 17:07:03        门禁接受: 读卡器                R23-33                410         张三
2007-7-13 18:27:13        门禁接受: 读卡器                R23-47                410         张三
2007-7-13 9:01:46        门禁接受: 读卡器                R23-48                410         张三
2007-7-10 10:36:46        门禁接受: 读卡器                R23-33                398         李四
2007-7-10 9:34:47        门禁接受: 读卡器                R23-48                398         李四
2007-7-10 9:34:54        门禁接受: 读卡器                R23-36                398         李四
2007-7-11 11:21:47        门禁接受: 读卡器                R23-33                398         李四
2007-7-11 11:41:09        门禁接受: 读卡器                R23-35                398         李四
2007-7-11 9:09:58        门禁接受: 读卡器                R23-48                398         李四
2007-7-11 9:10:05        门禁接受: 读卡器                R23-36                398         李四
2007-7-12 11:54:50        门禁接受: 读卡器                R23-35                398         李四
2007-7-12 9:03:47        门禁接受: 读卡器                R23-41                398         李四
2007-7-12 9:04:17        门禁接受: 读卡器                R23-34                398         李四
2007-7-12 9:24:45        门禁接受: 读卡器                R23-33                398         李四
2007-7-13 10:15:18        门禁接受: 读卡器                R23-33                398         李四
2007-7-13 10:15:38        门禁接受: 读卡器                R23-20                398         李四
2007-7-13 9:31:00        门禁接受: 读卡器                R23-19                398         李四
2007-7-13 9:42:39        门禁接受: 读卡器                R23-34                398         李四
------------------------------------------------------------------------------------------------------------------------------------------------------
作者: doctorjxd    时间: 2007-08-08 18:09
时间补零;sort多字段排序;去除不要的记录
作者: flymeteor    时间: 2007-08-08 18:14
标题: 回复 #2 doctorjxd 的帖子
不知道通过shell如何去除不需要的数据,数据量大概有60多万条。
作者: rdcwayx    时间: 2007-08-09 08:55
我只能做到取单天的纪录 (你可以另用个循环替换命令中的日期得出结果)

2007-7-11 每人最早的纪录
$ cat list |sed 's/://g' |grep "2007-7-11" |sort -k2r |awk  '! a[$NF]++'
2007-7-11 95634        门禁接受 读卡器                R23-27                207         王五
2007-7-11 94459        门禁接受 读卡器                R23-33                410         张三
2007-7-11 91005        门禁接受 读卡器                R23-36                398         李四

2007-7-11 每人最晚的纪录
$ cat list |sed 's/://g' |grep "2007-7-11" |sort -k2 |awk  '! a[$NF]++'
2007-7-11 100519        门禁接受 读卡器                R23-28                207         王五
2007-7-11 112147        门禁接受 读卡器                R23-33                398         李四
2007-7-11 122144        门禁接受 读卡器                R23-35                410         张三
作者: ly5066113    时间: 2007-08-09 10:27
  1. awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{gsub(/:/,"");if($2<b[$1" "$NF]){b[$1" "$NF]=$2}if($2>d[$1" "$NF]){d[$1" "$NF]=$2}}END{for(i in b) print i,b[i],d[i]}' urfile
复制代码


看看这样的结果行不行。
作者: rdcwayx    时间: 2007-08-09 11:13
原帖由 ly5066113 于 2007-8-9 10:27 发表
awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{gsub(/:/,"");if($2d[$1" "$NF]){d[$1" "$NF]=$2}}END{for(i in b) print i,b,d}' urfile

看看这样的结果行不行。

$ awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{gsub(/:/,"");if($2<b[$1" "$NF]){b[$1" "$NF]
=$2}if($2>d[$1" "$NF]){d[$1" "$NF]=$2}}END{for(i in b) print i,b,d}' list
2007-7-13 王五 93018 111907
2007-7-11 王五 95424 100519
2007-7-10 李四 93447 103646
2007-7-10 王五 83448 110849
2007-7-13 张三 90146 182713
2007-7-13 李四 93100 101538
2007-7-12 张三 94303 102705
2007-7-12 李四 90347 115450
2007-7-11 张三 92800 122144
2007-7-12 王五 85551 102711
2007-7-11 李四 90958 114109
2007-7-10 张三 85019 173818

好像不行,我看到每天有三个记录。
作者: mxbao    时间: 2007-08-09 11:16
原帖由 rdcwayx 于 2007-8-9 08:55 发表
我只能做到取单天的纪录 (你可以另用个循环替换命令中的日期得出结果)

2007-7-11 每人最早的纪录
$ cat list |sed 's/://g' |grep "2007-7-11" |sort -k2r |awk  '! a[$NF]++'
2007-7-11 95634        门 ...

这样写的排序有点问题,应该是sort -k2n,是排序最早, -k2nr是排序最晚.
作者: rdcwayx    时间: 2007-08-09 11:21
嗯,你是对的。

$ cat list |sed 's/://g' |grep "2007-7-11" |sort -k2rn |awk  '! a[$NF]++'
2007-7-11 122144        门禁接受 读卡器                R23-35                410         张三
2007-7-11 114109        门禁接受 读卡器                R23-35                398         李四
2007-7-11 100519        门禁接受 读卡器                R23-28                207         王五

$ cat list |sed 's/://g' |grep "2007-7-11" |sort -k2n |awk  '! a[$NF]++'
2007-7-11 90958        门禁接受 读卡器                R23-48                398         李四
2007-7-11 92800        门禁接受 读卡器                R23-33                410         张三
2007-7-11 95424        门禁接受 读卡器                R26-19                207         王五
作者: mxbao    时间: 2007-08-09 14:28
cat list |sed 's/://g'|sed 's/-//g'  |sort -k6 -k1n -k2n |awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{gsub(/:/,"";if($2<b[$1" "$NF]){b[$1" "$NF]=$2}}END{for(i in b) print i,b}'收集所有人员每天最早的打卡记录
cat list |sed 's/://g'|sed 's/-//g'  |sort -k6 -k1nr -k2nr |awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{gsub(/:/,"";if($2>b[$1" "$NF]){b[$1" "$NF]=$2}}END{for(i in b) print i,b}'收集所有人员每天最迟的打卡记录
勉强集合上几位的思路, 把记录都输入到一个文本,再排序

[ 本帖最后由 mxbao 于 2007-8-9 14:43 编辑 ]
作者: mxbao    时间: 2007-08-09 14:44
汗,,不知道为什么字体会变了,最后是print  i,b :em11:
         
.............................

[ 本帖最后由 mxbao 于 2007-8-9 14:47 编辑 ]
作者: ly5066113    时间: 2007-08-09 15:33
最早
  1. awk '!b[$1" "$NF]{b[$1" "$NF]=$2}{c=$0;gsub(/:/,"");if($2<b[$1" "$NF]){b[$1" "$NF]=$2;a[$2$1" "$NF]=c}}END{for(i in b) print a[b[i]i]}' urfile
复制代码

最晚
  1. awk '{c=$0;gsub(/:/,"");if($2>b[$1" "$NF]){b[$1" "$NF]=$2;a[$2$1" "$NF]=c}}END{for(i in b) print a[b[i]i]}' urfile
复制代码

[ 本帖最后由 ly5066113 于 2007-8-9 15:35 编辑 ]
作者: zxlzys    时间: 2007-08-10 15:21
在提供个思路 早晚混合双打
cat urfile |sort -k1,1 -k7,7 -k2n,2|awk '{if(tmp!=$7){printf("%s\n%s\n",last,$0);tmp=$7;}last=$0;}END{print last;}'




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