ふと、LinuxやMacのコンソール上で出力内容を複数列に分割する場合、どうすればいいかなと思ったので少し調べた。
複数列といっても、分割する方向が縦か横かで違って来ると思うので、ここではそこも踏まえて調べることとする。
Linuxの場合だとpasteコマンドやprコマンドをうまく使う必要があるが、Mac OS Xの場合BSDベースのためrsコマンドやlamコマンドといったコマンドを使うことでより簡単に処理が行える。
今回は、2列に分割しての例で進めていく。
1.Linuxの場合
横方向
方向が横方向の場合、普通にpasteコマンドを使用すればよい。
もしくは、prコマンドで「-a」オプションを付与する。
コマンド | paste - -
コマンド | pr -2 -t -a
blacknon@BS-PUB-UBUNTU-01:/tmp$ printf "%d\n" {1..20} | paste - -
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
blacknon@BS-PUB-UBUNTU-01:/tmp$ printf "%d\n" {1..20} | pr -2 -t -a
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
縦方向
方向が縦方向の場合、Linuxではprコマンドを用いる。
それ以外の方法となると、一度pasteで列を分割した後にdatamashなどを使って表の縦横の入れ替えをするなどがあるが、この場合だと行数を制限する必要があるのであまりお勧めしない。
Ubuntuの場合であれば、後述するBSD系のコマンドであるrsコマンドがインストールできるのでそれを用いる方法もある。
コマンド | pr -2 -t
コマンド | rs -t 0 2
blacknon@BS-PUB-UBUNTU-01:/tmp$ printf "%d\n" {1..20} | pr -2 -t
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
blacknon@BS-PUB-UBUNTU-01:/tmp$ printf "%d\n" {1..20} | rs -t 0 2
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
2.Mac OS Xの場合
横方向
横方向の場合は、Mac OS XでもLinuxと変わらずpasteコマンドを使えばよい。
rsコマンドで「-t」オプションを付与しなくても同様の処理ができる。
コマンド | paste - -
コマンド | rs 0 2
BS-VPN-MAC-01:~ user$ printf "%d\n" {1..20} | paste - -
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
BS-VPN-MAC-01:~ user$ printf "%d\n" {1..20} | rs 0 2
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
縦方向
Mac OS Xの場合、標準でrsコマンドが使えるので、それを使用すればよい。
コマンド | rs -t 0 2
BS-VPN-MAC-01:~ user$ printf "%d\n" {1..20} | rs -t 0 2
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
BS-VPN-MAC-01:~ user$ printf "%d\n" {1..20} | rs -t 0 3
1 8 15
2 9 16
3 10 17
4 11 18
5 12 19
6 13 20
7 14