ターミナル上で複数列を1列にして表示させる

Linuxなどのターミナル上で、複数列を1列にして表示させるのってどうすると良いんだろなと思ったので、ちょっと調べてみた。
1列に変換するといっても、横方向と縦方向の2パターンあると思うので、一応両方のパターンについてやってみる。

横方向から1列に変換する

横にスペース区切りに縦1列に変換する場合は、以下のようにxargsで読み込んでいってあげるといいだろう。

cat file.path | xargs -n1
blacknon@blacknon-ThinkPad-X201:~$ cat test1.txt 
a01 a02 a03 a04 a05
b01 b02 b03 b04 b05
c01 c02 c03 c04 c05
d01 d02 d03 d04 d05
e01 e02 e03 e04 e05
blacknon@blacknon-ThinkPad-X201:~$ cat test1.txt | xargs -n1
a01
a02
a03
a04
a05
b01
b02
b03
b04
b05
c01
c02
c03
c04
c05
d01
d02
d03
d04
d05
e01
e02
e03
e04
e05
Sponsored Links

縦方向から1列に変換する

縦方向から1列に変換してやる場合、awkで以下のような処理をさせるくらいしか思いつかなかった。
(もっと他に書き方がありそうな気がするけど…)

cat file.path | awk '{i=1;m=NF;for(gf=1;gf<NF+1;gf++){l[i,gf]=$gf};while(getline==1){i++;for(gf=1;gf<NF+1;gf++){l[i,gf]=$gf};if(NF>m){m=NF}};for(f=1;f<m+1;f++){for(r=1;r<=i;r++){print l[r,f]}}}'
seq 1 $(awk '{if(m<NF){m=NF}}END{print m}' file.path) | xargs -I@ awk '{print $@}' file.path
blacknon@blacknon-ThinkPad-X201:~$ cat test1.txt | awk '{i=1;m=NF;for(gf=1;gf<NF+1;gf++){l[i,gf]=$gf};while(getline==1){i++;for(gf=1;gf<NF+1;gf++){l[i,gf]=$gf};if(NF>m){m=NF}};for(f=1;f<m+1;f++){for(r=1;r<=i;r++){print l[r,f]}}}'
a01
b01
c01
d01
e01
a02
b02
c02
d02
e02
a03
b03
c03
d03
e03
a04
b04
c04
d04
e04
a05
b05
c05
d05
e05
blacknon@blacknon-ThinkPad-X201:~$ seq 1 $(awk '{if(m<NF){m=NF}}END{print m}' test1.txt) | xargs -I@ awk '{print $@}' test1.txt 
a01
b01
c01
d01
e01
a02
b02
c02
d02
e02
a03
b03
c03
d03
e03
a04
b04
c04
d04
e04
a05
b05
c05
d05
e05

だいたいこんな感じか。


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*