awk之提取含有相同段行的第一行和最后一行

本文介绍如何利用awk及sed命令从大量日志数据中提取每天的第一行和最后一行记录,通过数组与非数组两种方法实现,并对比了它们的执行效率。
2011-07-06  0:38:40 copy file 192.168.1.67 speed: 2.256 MBps
2011-07-06  1:30:46 copy file 192.168.1.67 speed: 2.000 MBps
2011-07-06  2:30:43 copy file 192.168.1.67 speed: 2.095 MBps
2011-07-07  0:33:43 copy file 192.168.1.67 speed: 2.146 MBps
2011-07-07  1:30:43 copy file 192.168.1.67 speed: 2.095 MBps
2011-07-07  2:30:43 copy file 192.168.1.67 speed: 2.146 MBps
2011-07-07  2:32:55 copy file 192.168.1.67 speed: 5.126 MBps
2011-07-08  0:31:01 copy file 192.168.1.67 speed: 1.508 MBps
2011-07-08  1:32:51 copy file 192.168.1.67 speed: 1.816 MBps
2011-07-09  0:32:44 copy file 192.168.1.67 speed: 2.119 MBps
2011-07-09  1:34:48 copy file 192.168.1.67 speed: 1.935 MBps
2011-07-09  2:30:57 copy file 192.168.1.67 speed: 1.618 MBps
2011-07-09  6:05:57 copy file 192.168.1.67 speed: 1.358 MBps
2011-07-09  8:30:57 copy file 192.168.1.67 speed: 1.618 MBps
2011-07-10  0:30:55 copy file 192.168.1.67 speed: 1.679 MBps
2011-07-10  1:31:00 copy file 192.168.1.67 speed: 1.534 MBps
 
可能看着有点眼花,就是说如何提取每天的第一行数据或最后一行数据,红色就是第一行,蓝色就是最后一行。
 
 
数组解法:
  1. # 只提取每天的第一行数据
  2. awk '!a[$1]++' file
  3. awk '++a[$1]==1' file

  4. # 只提取每天的最后一行数据
  5. awk '{a[$1]=$0}END{for(i=1;i<=asort(a);i++)print a[i]}' file
  6. awk '!a[$1]++&&i{print i}{i=$0}END{print i}' file

 

非数组解法:

  1. # 只提取每天第一行数据
  2. awk '$1!=x{x=$1;print}' file

  3. # 只提取每天最后一行数据
  4. awk 'NR>1{if($1!=x)print y}{x=$1;y=$0}' file <(echo)



话说数组的效率那确实在大文件下够慢的,别看非数组的命令比较长点,效率那可是高的。

 

sed解法:

  1. # 只提取每天第一行数据
  2. sed -r ':a;$!N;s/([^ ]+)( +[^\n]+)\n\1.*/\1\2/;ta;P;D' file

  3. # 只提取每天最后一行数据
  4. sed -r ':a;$!N;s/([^ ]+) +[^\n]+\n\1(.*)/\1\2/;ta;P;D' file
  5. sed -r '$!N;/([^ ]+ ).*\n\1/!P;D' file
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值