我相信这会做到:
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