我相信这样可以:
awk '
{ split($0,data); }
END {
m = 10;
n = 3;
for( i = 1; i<=m; i++ ) {
for( j = 0; j<n; j++ ) {
printf "%s ", data[j*m + i] # output data plus space in one line
}
# here you might want to start a new line though you did not ask for it:
printf "\n";
}
}' inputfile
我的索引计数可能有误,但我相信您可以弄清楚。诀窍是第一行中的split。它将您的输入拆分为空格并创建一个数组data。 END 块在处理完您的文件后运行,并且仅通过索引访问 data。注意数组索引从 0 开始计数。
假设所有数据都在一行中。你的问题在这方面不是很清楚。如果它位于多行上,则必须以不同的方式将其读入数组。
希望这能让你开始。
编辑
我注意到你在我回答的时候改变了你的问题。所以改变
{ split($0,data); }
到
{ data[++i] = $1; }
考虑输入在不同的行。实际上,这可以让您首先将其读入二维数组。
编辑 2
读取二维数组
要读取为二维数组,假设 m 和 n 事先已知且未以某种方式在输入中编码:
awk '
BEGIN {
m = 10;
n = 3;
}
{
for( i = 0; i<m; i++ ) {
for( j = 0; j<n; j++ ) {
data[i,j] = $0;
}
}
# do something with data
}' inputfile
但是,由于您只想重新格式化数据,因此可以立即进行。结合这两种解决方案摆脱data并在命令行上传递m和n:
awk -v m=10 -v n=3'
{
for( i = 0; i<m; i++ ) {
for( j = 0; j<n; j++ ) {
printf "%s ", $0 # output data plus space in one line
}
printf "\n";
}
}' inputfile