53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

来訪ありがとうございます
シストレツールを自作してました
自分用の記事が多いのであまり役には立たないブログでした

f:id:sucar:20150414193802p:plain

自作システム詳細目次

sel_h ヘッダ指定で列データ抽出

C言語でパラメタ計算し、R言語へデータフレーム書式で引き渡すが、パラメタが増えるとデータサイズが膨大になる

計算より読み込みに時間がかかるし、メモリ不足も気になるので、解析で使わないパラメタはomitしてR言語に引き渡すようにしたい

当然、awkを使えば簡単に、、、、、

と思ったが、

  • 行の抽出は簡単 普通のパターン一致でも正規表現でも自由自在
  • 列の抽出は 番号でなら簡単 $1 $2 …
  • でも、ヘッダの文字列とのパターン一致で列を抽出したい

いろいろググってみましたが、ヘッダーの文字列とのパターン一致での列抽出のやり方にたどり付けなかった

思いつくのは

  • 列と行を入れ替えて
  • 行を抽出し
  • 再び、行と列を入れ替える

とかだけど、ひょっとして列⇔行入れ替えで一旦メモリにすべて読み込む必要あり?

そうするとR言語のメモリ問題とあまり変わらないので、あくまでも逐次処理で何んとかできないか? 試行錯誤

で、力技でひねり出したのが以下のコマンド

sel_h

---------------------------

#!/bin/bash
#ヘッダーを抜き出しtrでTABで改行してawksed用の置換スクリプトを作成
head -1 ./output/$1.txt | tr '\t' '\n' | awk '{printf("s/$%s/$%d/g\n",$1,NR)}'| sed -e '$d' > ./tmp/tmp.sed

#最後の,を消すsedコマンドを追加
echo s/,}/}/g >> ./tmp/tmp.sed

#パラメタリストからawkスクリプトawkで作成(for txt)
#cat ./prm/$2.txt | awk 'BEGIN {printf("{print ")} {printf("$%s,",$1)} END {print "}"}' >./tmp/slct_h.tmpl
#パラメタリストからawkスクリプトawkで作成(for csv)
cat ./prm/$2.csv | awk -F, 'BEGIN {printf("{print ")} {printf("$%s,",$1)} END {print "}"}' >./tmp/slct_h.tmpl

#但し↑で作成したawkスクリプトは{print $sp0m,$sp1m,$sp2m,}のようになっている
#なので、作成済みのsed置換スクリプトで置換し{print $21,$30,$39}のようにする
sed -f ./tmp/tmp.sed ./tmp/slct_h.tmpl >./tmp/slct_h.awk

#最後作成したawkスクリプトで列を抽出し、trでスペースをTABに変換して標準出力へ出力
cat ./output/$1.txt | awk -f ./tmp/slct_h.awk | tr ' ' '\t'

----------------------------

sel_h 対象データ 抜き出すパラメタリスト(csv)

で、ヘッダをみて列抽出してくれる

awkだけでなく、sed tr も駆使したごちゃごちゃコマンド 自分でももはや何がなんだかわからないw