Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4134
  • 博文数量: 2
  • 博客积分: 46
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-27 16:02
文章分类
文章存档

2012年(2)

我的朋友
最近访客

分类:

2012-11-03 18:47:16

文本:
stra b
stra c
stra d
strb 1
strb 2
strb 3

结果:
stra
b
c
d
strb
1
2
3

  1. awk '{print a[$1]++?$2:$1RS$2}' file

[解析]

  首先把语句剖析为2部分,第一部分是print,第二部分是打印输出的一个表达式。print输出的是什么内容呢?就是这个三目运算逻辑判断出的结果由print输出到屏幕。

  我们看看这个三目运算,分成三部分 (a[$1]++)--条件,?--成立则执行后面的内容,:--不成立则执行后面的内容。把每一行的$1作为下标放入数组a中,当然执行到第一行a[stra]是没有值的,即为空,条件为假,则输出stra"\n"b,然后自加一次该下标的数组a就有值了,为1。到了第二行,这个数组是有值的,条件为真,则只输出c,以此类推达到了效果。


 

 

  1. awk '{print $1==i?$2:$1 RS $2;i=$1}' file

[解析]

  利用一个变量来保存$1的值,然后来比较判断,效率上比数组高,特别是大文件的时候能体现优势。


  1. sed -nr ':a;N;s/^(\w*)( .*)\n\1(.*)/\1\2\3/;$bb;ta;:b;h;s/([^\n])\n.*/\1/;s/ /\n/g;p;x;s/[^\n]*\n(.*)/\1/;ta' file


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

上一篇:没有了

下一篇:C语言中下标和数组名可互换

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