これでうまくいくと思います:
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 からカウントされることに注意してください。
すべてのデータが 1 行にあると仮定します。あなたの質問はこれについて明確ではありません。複数の行にある場合は、別の方法で配列に読み込む必要があります。
これで始められることを願っています。
編集
私が回答している間に質問を変更したことに気付きました。だから変える
{ split($0,data); }
に
{ data[++i] = $1; }
入力が異なる行にあることを考慮します。実際、これにより、最初にそれを 2 次元配列に読み込むオプションが与えられます。
編集2
2 次元配列
を読み取る 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
ただし、データを再フォーマットしたいだけなので、すぐに実行できます。2 つのソリューションを組み合わせて、コマンド ラインで取り除き、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