シェルで行列を転置
以下の様なデータ(data.txt)をシェルで転置する.
0 615276 615276 615276 615276 615276 615276 615276 615276 0.1 580455 587213 587232 589734 590158 591019 592493 596381 0.2 500342 522058 521903 530142 531954 534774 539629 552938 0.3 426424 458656 458049 470653 474194 478489 485944 507184 0.4 375159 411233 410162 424713 429627 434569 443225 468618 0.5 342701 378289 376901 391707 397429 402447 411317 437847 0.6 322694 355534 353990 368090 374123 378893 387403 413158 0.7 310526 339517 337952 350821 356785 361137 368960 392786 0.8 303315 327889 326402 337732 343347 347183 354112 375272 0.9 299324 318961 317638 327164 332195 335441 341278 359132
ワンライナーで以下のように書いた.
N=$(head -n 1 data.txt | wc -w);for i in `seq 1 $N`;do awk '{print $'$i'}' < data.txt | tr '\n' '\t' ; echo;done
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 615276 580455 500342 426424 375159 342701 322694 310526 303315 299324 615276 587213 522058 458656 411233 378289 355534 339517 327889 318961 615276 587232 521903 458049 410162 376901 353990 337952 326402 317638 615276 589734 530142 470653 424713 391707 368090 350821 337732 327164 615276 590158 531954 474194 429627 397429 374123 356785 343347 332195 615276 591019 534774 478489 434569 402447 378893 361137 347183 335441 615276 592493 539629 485944 443225 411317 387403 368960 354112 341278 615276 596381 552938 507184 468618 437847 413158 392786 375272 359132
まず、data.txtの列数を数える。headで一行だけ取ってきて、そのデータ数をカウントする。
この結果をNに格納し、各列に対してawkを実行する。awkでは、改行(\n)をタブ(\t)に変換している。
もっとシンプルなコマンドやoctave,matlabといったソフトウェアを使うという方法もあると思うが,まあ動けば何でもよいということで.
# 訂正 2016.11.19
doの後に";"があってコマンドが通らなかったため、訂正
ファイル名が全部違っていたので、訂正
ご指摘ありがとうございました。