使用awk翻转二维数组

下午本来说学习下perl,看了下linux系统运维qq群(198173206),见到awk大神写的潇洒的awk,忍不住,跟着学习下了。

题目:使用awk翻转二维数组?

文本文件:array.txt

budong@budongdeMacBook-Pro:~/Documents/tmp$ cat array.txt
1   2   3   4   5   6   7   8   9  10
12  14  16  18  20  22  24
15  18  21  24  27  30  33  36  39  42

要求输出结果为:

1    12    15
2    14    18
3    16    21
4    18    24
5    20    27
6    22    30
7    24    33
8          36
9          39
10         42

方法一:

@—Redundancy— 给出的做法,传统做法,就是直接翻转二维数组,列变为行,读取二维数组每一列输出,如下代码:

budong@budongdeMacBook-Pro:~/Documents/tmp$ awk -v ORS=' ' 
'{max=max>NF?max:NF;for(i=1;i<=max;i++)a[NR,i]=$i}
END
{for(i=1;i<=max;i++)
{for(j=1;j<=NR;j++)
{print (a[j,i]=="")?"  ":a[j,i]}printf "\n"}}' array.txt
1 12 15
2 14 18
3 16 21
4 18 24
5 20 27
6 22 30
7 24 33
8    36
9    39
10    42

简单解释:

-v ORS=‘ ' 设置每行记录的换行符为 ‘ ‘。
{max=max>NF?max:NF;for(i=1;i<=max;i++)a[NR,i]=$i} 将文件记录读入二维数组,max是NF的最大长度,也是下文输出列的最大长度。
{for(i=1;i<=max;i++){for(j=1;j<=NR;j++){print (a[j,i]=="")?"  ":a[j,i]}printf "\n”}} 输出翻转后的二维数组,外层循环迭代列的长度max,内层循环迭代行NR,实现翻转。其中,a[j,i]=="")?"  ":a[j,i]为了对齐三目运算符,如果值是“”,则变为” “,主要是位了对齐。

方法二:

@深圳-PF 给出的答案,这个思路很牛逼,第一次看到,如下:

budong@budongdeMacBook-Pro:~/Documents/tmp$ awk 'NF>max{max=NF}
{for(i=1;i<=max;i++)a[i]=a[i]$i"\t"}
END{for(i=1;i<=max;i++)print a[i]}' array.txt
1    12    15
2    14    18
3    16    21
4    18    24
5    20    27
6    22    30
7    24    33
8          36
9          39
10         42

简单解释:

这种思路是读取文件,将每一列使用字符串拼接变为一个值,存入一维数组,然后迭代输出每一列。如上面输出的输出中 “1 12 15” 是一维数组的第一个值,”2 14 18”是一维数组的第二个值...

参考资料:

我常参考的awk教程:http://www.cnblogs.com/chengmo/archive/2013/01/17/2865479.html

python翻转二维数组的实现方法:http://peiqiang.net/2015/07/14/a-python-list-example.html