1)
cat file:
1
a
2
b
3
c
4
d
以空行为分割,把文本横向打印:
1 2 3 4
a b c d
- 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循环依次打印出这个数组。
- 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
- 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 为基数,如何把数组的二维下标操作成这样。
- 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) |