アプリ版:「スタンプのみでお礼する」機能のリリースについて

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」ファイルを生成したい。

以上、宜しくお願いします。

A 回答 (2件)

もしかしたら私がしらないだけかもしれませんが



>selectfile "SELECT BID FROM BOX WHERE BOX.PRO_NAME like \"$name[i]\" " $name[i].rpt

このselectfileって何でしょうか?
一般的なawkには無いと思うのですが、何か特別なawkではこういう風に記述すると正常に動作してくれものなのでしょうか?
検索しましたがselectfileというものが使用出来るawkが見つからなかったもので。。。
    • good
    • 0
この回答へのお礼

回答、有難うございました。

お礼日時:2008/04/04 22:43

自作されたソースは、どういう思想で作られたかわからなかったので、「-希望結果-」に


なるように書いてみました。
自作のものは、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の場合)
    • good
    • 0
この回答へのお礼

回答、有難うございました。

お礼日時:2008/04/04 22:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!