- ベストアンサー
AWK SQL実行後のファイル出力について
AWK初心者です。 Linux 7.3 ※前回に続き、お教え下さい。 改行された以下のファイル(num.txt)があります。 productA productB productC productD productE このファイルをAWKスクリプトから読込み、SQLの変数に代入、実行後、productX.rptとして、出力したいのですが、「parse error」となります。 自作では、下記のようになりましたが、希望する結果には程遠いです。 修正点等、アドバイスを宜しくお願いします。 -自作- awk '{ name[FNR] = $0;} { for(i = 1; i <= FNR; i++) { echo "----- TEST -----" selectfile "SELECT BID FROM BOX WHERE BOX.PRO_NAME like \"$name[i]\" " $name[i].rpt } } ' num.txt -希望結果- 「productA」から「productE」毎にSQLを実行し、 その結果を同名の「productA.rpt」から「productE.rpt」ファイルを生成したい。 以上、宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
自作されたソースは、どういう思想で作られたかわからなかったので、「-希望結果-」に なるように書いてみました。 自作のものは、one linerで書かれていますが、おそらく、one linerで書くのは難しいと 思います。 こちらで使ったDBMSは、PostgrSQLです。 ---psql.awk--- { print "SELECT BID FROM BOX WHERE BOX.PRO_NAME like " $0 > "psql.txt" # 1) cmd = "psql -e -f psql.txt -U " USER " " DB # ※ print "--- " $0 ".rpt ---" > $0 ".rpt" # 2) while( cmd | getline buffer) { # 3) print buffer >> $0 ".rpt" # 4) } close(cmd) } gawk -f psql.awk -v USER=ユーザ名 -v DB=データベース名 num.txt で動くと思います。 (パイプラインのWarningが出るかも知れませんが、結果に影響はありません。) 手法としては、awkとDBコマンドは直接連携できないので、 1)一旦SQL文を、awk上から一時ファイルに書き出す。(psql.txtがそれです) 2)レポートファイル毎のタイトルを、出力ファイルに書き出す 3)1)で作ったSQL文のファイルをSQLコマンドラインインタプリターに渡し、その 結果をパイブラインで一行づつ読み込む 4)3)で読み込んだ一行を結果ファイルに出力する。 (説明とコメントの番号は、一致させました) * ユーザ名とデータベース名は外部から与えられる形にしました。 -v 変数名=変数値をawkのコマンドラインで渡すと、変数名がawkスクリプトの中で 有効になります。 ※ PostgreSQL以外のDBMSの場合は、SQLコマンドラインインタプリターの パラメータに合わせて、※の箇所を修正してください。 例:sqlplus ユーザ名/パスワード@接続識別文字列 @SQL文ファイル名(.sql) (Oracle SQL*Plusの場合)
その他の回答 (1)
- Lean
- ベストアンサー率72% (435/603)
もしかしたら私がしらないだけかもしれませんが >selectfile "SELECT BID FROM BOX WHERE BOX.PRO_NAME like \"$name[i]\" " $name[i].rpt このselectfileって何でしょうか? 一般的なawkには無いと思うのですが、何か特別なawkではこういう風に記述すると正常に動作してくれものなのでしょうか? 検索しましたがselectfileというものが使用出来るawkが見つからなかったもので。。。
お礼
回答、有難うございました。
お礼
回答、有難うございました。