Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2968773
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-11-11 23:30:39

文本:
Nov 11:12:13 aa bb cc
Nov 12:12:14 aa bb cc
Nov 12:12:15 yy bb cc
Nov 12:12:16 yy bb cc
Nov 12:12:17 zz bb cc
Nov 12:12:18 zz bb cc
Nov 12:12:19 zz bb cc

1)
按相同的特征,只保留最后一行
Nov 12:12:14 aa bb cc
Nov 12:12:16 yy bb cc
Nov 12:12:19 zz bb cc




  1. sed 'N;/.*\(\( ..\)\{3\}\)\n.*\1/!P;D' file
[解析]
N 读取下一行,把需要的特征字符串标记出来,再匹配下一行是否符合这个特征,如果符合的话,就D,删除 pattern space 的第一行,并跳转去命令行开始处继续执行 N,读取下一行,如果不匹配了,那么 P 打印 pattern space 的第一行,并 D 删除第一行,又继续跳转去命令行首,这样就把特征相同的行,打印了最后一行,前面相同的都删除了。直到最后一行,N 无法读取下一行时就会中止后面的命令,并默认打印出最后 pattern space 里的内容。



  1. #顺序随机:
  2. awk '{a[$3$4$5]=$0}END{for(i in a)print a[i]}' file

  3. #顺序输出:
  4. awk '{n=$3$4$5;a[n]=$0;if(!b[n]++)c[++j]=n}END{for(i=0;i++<j;)print a[c[i]]}' file
  5. awk '!a[$3$4$5]++&&i{print i}{i=$0}END{print i}' file

  6. 非数组版:
  7. awk 'NR>1&&$3$4$5!=x{print y}{x=$3$4$5;y=$0}END{print y}' file




2)
按相同的特征,只保留第一行
Nov 11:12:13 aa bb cc
Nov 12:12:15 yy bb cc
Nov 12:12:17 zz bb cc



  1. sed ':a;N;/.*\(\( ..\)\{3\}\)\n.*\1/s/\n.*//;ta;P;D' file
[解析]
原理也是差不多的,N 读取下一样,匹配这样的特征的,就把下一行替换掉(删除下一行),替换成功后跳转到标签a,继续 N 读取下一行,当不匹配特征时,不会完成替换,ta 自然也不会生效,这时候执行后面的 P;D 打印第一行并删除第一行,然后跳转至命令开始处继续执行。直到末行 N 无法读取下一行,则自动中止后面的命令,并输出 pattern space 里的内容。


  1. 数组版:
  2. awk '!a[$3$4$5]++' file

  3. 非数组版:
  4. awk '$3$4$5!=x{x=$3$4$5;print}' file

阅读(5206) | 评论(0) | 转发(0) |
0

上一篇:sed之计数打印

下一篇:零宽断言详解

给主人留下些什么吧!~~