テキスト処理Tip - 行列変換


いわゆる行列変換です。
盾と矛…ではなくて縦と横を入れ替え(て、表形式に整形して表示す)る方法です。

タブ区切りテキスト hoge.tsv を処理する場合:

TD=$(mktemp -d)
cat hoge.tsv | nl -v 1000 | while read -r nm ln; do echo "$ln" | tr '\t' '\n' > $TD/$nm.txt; done
ls $TD/*.txt | xargs paste | column -ts$'\t'
rm -r $TD

この処理には専用のコマンドが存在せず、また、一行野郎にまとめるにはちょっと面倒なのは、少し調べればすぐわかります。
良くあるのは、2次元配列に読み込んで縦と横を入れ替えて出力するプログラムですが。
そういうプログラム的発想ではなく、もっとこう、テキスト処理の範疇で何とかならないかと考えた手順です。
一時ファイルを作らざるを得なかったのが痛恨事ですね。

ちなみに cat hoge.tsv の部分をmysqlなどでのselect文に置き換えると、応用が広がるでしょう。
行数が9行以下なら nl コマンドのオプションは省略できます。

一度ばらしたデータをpasteコマンドで集め直しているので、何かの拍子にデータのズレが発生すると目も当てられません。改行コードを含むデータが混じるとか。RDBをいじっていると良くある話です。
御注意ください。

ま、90%の処理はうまくいくと思ってますので、改善する予定はありません:p

余談:
WindowsでやるならExcelを利用できます。頭を悩ませる必要はありません。頭を使う前に手を動かせ!
技術屋としてはそれもどうかと思いますが。