我有一个文件,其中有 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
遍历旧文件中属于新文件 行的行数。j
j
i
变化
虽然它使初学者阅读起来更加困难,但三元语句可以用来稍微改进格式:
$ 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
。否则,它返回换行符。