それぞれ128行と5列の25行列を持つファイルがあります。各行列は垂直方向に1つずつ配置される。このように
ファイル入力(ファイル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
行番号です。各行を配列として保存します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
。それ以外の場合は改行文字を返します。