Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216340
  • 博文数量: 87
  • 博客积分: 192
  • 博客等级: 入伍新兵
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 07:44
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(86)

分类:

2012-04-14 15:39:10

原文地址:sed之奇偶行交换 作者:zooyo

文本:
1
2
11
22
111
222
888
 
奇偶行进行交换:
2
1
22
11
222
111
888
 
  1. sed -n 'h;$!{n;G};p' file

[解析]

    把第一行内容交换进缓冲区,然后n进入下一行,G把缓冲区内容追加到该行的模式空间内,然后打印。整好就是把第1行,换到第2行后,第3行换到第4行后以此类推。最后一行不操作,直接输出,目的是最后一行如果是奇数行时也会输出。

 

 

  1. awk 'i=NR%2{x=$0;next}{print $0 RS x}END{if(i)print x}' file

[解析]

    NR对2取余,那么是偶数行的时候条件为假不会执行后面的赋值,则默认执行后面的打印,如果最后是奇数行,那么i的值是1,则最后END会打印出该行。

 

  1. awk 'getline i{print i}1' file

[解析]

    Tim大师的思路,真是佩服到不行啊,把getline作为pattern,如果是最后一行是奇数行,没有下读取的话,是不会执行后面的print的,完美解决了奇数行最后一行打印的问题,第一行,读取下一行给i,然后打印i的值(即下一行的内容),然后patter为1执行默认的{print},这样刚好把两行互换,而且还具备了最后一行是奇数行的判断,佩服。

阅读(726) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~