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

縦方向から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

だいたいこんな感じか。