ふと、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