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 条评论。