sel_h ヘッダ指定で列データ抽出
C言語でパラメタ計算し、R言語へデータフレーム書式で引き渡すが、パラメタが増えるとデータサイズが膨大になる
計算より読み込みに時間がかかるし、メモリ不足も気になるので、解析で使わないパラメタはomitしてR言語に引き渡すようにしたい
当然、awkを使えば簡単に、、、、、
と思ったが、
- 行の抽出は簡単 普通のパターン一致でも正規表現でも自由自在
- 列の抽出は 番号でなら簡単 $1 $2 …
- でも、ヘッダの文字列とのパターン一致で列を抽出したい
いろいろググってみましたが、ヘッダーの文字列とのパターン一致での列抽出のやり方にたどり付けなかった
思いつくのは
- 列と行を入れ替えて
- 行を抽出し
- 再び、行と列を入れ替える
とかだけど、ひょっとして列⇔行入れ替えで一旦メモリにすべて読み込む必要あり?
そうするとR言語のメモリ問題とあまり変わらないので、あくまでも逐次処理で何んとかできないか? 試行錯誤
で、力技でひねり出したのが以下のコマンド
sel_h
---------------------------
#!/bin/bash
#ヘッダーを抜き出しtrでTABで改行してawkでsed用の置換スクリプトを作成
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)
で、ヘッダをみて列抽出してくれる