如何用awk取重复记录的第一条记录和最后一条记录

2011-10-25 8:41:20
2011-10-25 8:41:38
2011-10-25 18:10:09
2011-10-26 8:29:05
2011-10-26 18:07:27
2011-10-27 8:35:41
2011-10-27 18:51:18
2011-10-28 8:38:00
2011-10-28 18:08:01
2011-10-29 8:46:13
2011-10-29 18:08:00
2011-10-31 18:05:33
2011-11-1 8:33:16
2011-11-1 18:07:07
2011-11-2 8:29:46
2011-11-2 18:05:41
2011-11-3 8:29:17
2011-11-3 18:04:40
2011-11-4 8:34:29
2011-11-4 18:10:23

#取出每天的第一条记录
awk '!a[$1]++' file
!a[$1]++取第一次出现的

#统计相同的日期的个数
awk '{a[$1]++}END{for(i in a)print i,a[i]}' file
 
#加个($2==8)的限制条件
awk -F ' |:' '!a[$1]++&&($2==8)' file

#取每天的最后一条记录
awk '!a[$1]++&&i{print i}{i=$0}END{print i}' file
awk 'NR>1{if($1!=x)print y}{x=$1;y=$0}END{print $0}' file   
取最后一条只需取首次出现的上面那条即可,通过{i=$0}将$0赋给i,!a[$1]++限制首次出现,
首行i为空,会打印一个空行,加个&&i来保证不打印那个空行,最后必须要有END{print i},
最后一行要单独打印
{i=$0}保存上一行的记录是常规用法。
if($1!=x)print y}{x=$1;y=$0} 保存$1 $0
#加个($2==18)的条件
awk -F ' |:' '!a[$1]++&&i{print i}{if($2==18)i=$0}END{print i}' file

附录
1、awk ‘! a[$0]++’ 怎么理解?
这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:
<1> :”!” 即非。
<2>:a[$0],以$0为数据下标,建立数组a
<3>:a[$0]++,即给数组a赋值,a[$0]+=1
<4> :那么组合起来,awk是怎么执行!a[$0]++的呢?

即: ‘!a[$0]++’ 当$0的内容首次出现时,a[$0]将为空(相当于0),
此时将先求!a[$0]的值(也是整个式子的值,即为非空 true ,将影响后续动作,执行默认的print)
然后对a[$0]进行+1,a[$0] 加1后为1,当下次出现时a[$0]即不为空,表达式结果为非真 false,即不打印

2、怎么用awk取文本的最后一行?
awk 'END {print}'

扩展阅读:
awk初学之常见问题:http://bbs.chinaunix.net/thread-2309494-1-1.html
怎么用awk取文本的最后一行?:http://bbs.51cto.com/thread-961661-1.html
awk的程序指令模型:http://www.letuknowit.com/topics/20120319/awk-program-model.html/

参考资料:
awk之取每天的第一条记录和最后一条记录:http://blog.csdn.net/woshibianhe/article/details/7316029
awk去重复项:http://blog.chinaunix.net/uid-25508399-id-3230163.html
用awk数组去除重复域awk‘!a[$1]++’:http://www.jbxue.com/article/1560.html

发表评论?

0 条评论。

发表评论