将垂直数组数据转换为水平数组数据

将垂直数组数据转换为水平数组数据

我有一个文件,其中有 25 个矩阵,每个矩阵有 128 行和 5 列。每个矩阵都以垂直方式一个接一个地放置。像这样

文件输入(文件1):

Array1
Array2
Array3
...
Array25

我想以水平方式放置每个数组。像这样(文件2)

Array1  Array2  Array3 ... Array25

我尝试使用这个命令:

pr -25t -w 4000 file1 > file2

但没有按照我想要的方式工作。

答案1

让我们考虑这个测试文件,其中包含每行 3 行的数组:

$ cat File
1 2
3 4
5 6
a b
c d
e f
A B
C D
E F

现在,让我们连接数组:

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File
1 2 a b A B 
3 4 c d C D 
5 6 e f E F 

在您的数据文件中,每个数组有 128 行。在这种情况下,运行:

awk -v nr=128 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File

怎么运行的

  • -v nr=128

    这将变量设置nr为每个数组的行数。

  • a[NR]=$0

    NR是行号。我们将每一行(line)保存在数组中a

  • END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}

    当我们读入所有行后,这会以您想要的形式再次将它们写出。

    为此,我们循环遍历i以 开头i=1并以 结尾的变量i=nr。对于每个i,我们打印新行i。对于每个值,我们循环i遍历旧文件中属于新文件 行的行数。jji

变化

虽然它使初学者阅读起来更加困难,但三元语句可以用来稍微改进格式:

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) for (j=i;j<=NR;j+=nr) printf "%s%s",a[j],(j+nr<=NR?" ":"\n")}' File
1 2 a b A B 11 22
3 4 c d C D 33 44
5 6 e f E F 55 66

j+nr<=NR?" ":"\n"是一个三元语句。如果 则返回一个空格j+nr<=NR。否则,它返回换行符。

相关内容