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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-09-16 14:27:43

1)
cat file:
1
a

2
b

3
c

4
d

以空行为分割,把文本横向打印:
1 2 3 4
a b c d

  1. awk '!NF{i=1;next}{if(i){a[i]=a[i]" "$0;i++}else{a[NR]=$0;j=NR}}END{for(i=1;i<=j;i++)print a[i]}' file
[解析]
    当空行(!NF)时执行第一个{action},所以现在第一行不会执行该语句,那么执行第二个,这时候i是0,执行else后面的复制,这样把第一个段落的值都按NR存入数组a中了,这时候遇到空行,把i值设定为1,这时候第二个{action}的if判断为真,这就相当把第二个段落的值合并到第一个段落之后了,同样执行到第三个段落时候,空行把i值又重置为1,又把第三个段落的值合并到前面段落之后了。最后通过for循环依次打印出这个数组。



  1. awk '!NF{i=0;next}{++i;a[i]=length(a[i])?a[i]" "$0:$0}END{for(j=1;j<=i;j++)print a[j]}' file
[解析]
    这个原理和上面是一样的,把数据按数字递增为数组下标把每行内容赋值给数组a,最后打印出来该数组。




2)
cat file:
1
2
3
4
5
6
7
8
9

要求合并成:
1       4       7
2       5       8
3       6       9



  1. awk '{a[(NR%3?NR%3:3),(y=int((NR-1)/3)+1)]=$1}END{for(j=1;j<=3;j++){for(k=1;k<3;k++)printf a[j,k]"\t";print a[j,k]}}' file
[解析]
代码看起来很复杂,其实原理是这样:

1 = a[1,1]
2 = a[2,1]
3 = a[3,1]
4 = a[1,2]
5 = a[2,2]
6 = a[3,2]
7 = a[1,3]
8 = a[2,3]
9 = a[3,3]

利用关联数组最后 END 用两个 for 循环输出这个二维数组的内容,所以前面做的方法都是想办法以 NR 为基数,如何把数组的二维下标操作成这样。


  1. awk '{c=(NR-1)%3;a[c]=a[c]?a[c]"\t"$1:$1}END{for(i=0;i<3;i++)print a[i]}' file
[解析]
这是两个不同的思路,这个是也是利用 NR 为基数,对取余的值作为下标,利用数组来拼接保存内容。

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

上一篇:关闭机箱蜂鸣器

下一篇:C语言中的const

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