プロが教えるわが家の防犯対策術!

作成しているawkスクリプトを実行すると
”aaa" "1111" "kkk"
”bbb" "2222" "jjj"
という出力になってしまいます。
ダルルクォーテーションを削除したかったので
printf(”%s %s %s\n"、 adata、 bdata、 cdata)
       ↓
adataprint =gsub(”¥””、” ”、adata)
bdataprint =gsub(”¥””、” ”、bdata)
cdataprint =gsub(”¥””、” ”、cdata)
printf(”%s %s %s\n"、 adataprint、 bdataprint、 cdataprint)
としてみたのですが思ったような出力
aaa 1111 kkk
bbb 2222 jjj
にはなってくれません。
こういった処理はどのようにすればいいのか誰か教えていただけないでしょうか?

A 回答 (4件)

机上デバッグ開始!



> 作成しているawkスクリプトを実行すると
> ”aaa" "1111" "kkk"
> ”bbb" "2222" "jjj"
> という出力になってしまいます。

入力ファイルは Excel データのエクスポートかな?
.csv か、タブ区切りテキストと、あたりをつけてみる。
※ 文字列を『"』で囲むのはよくあるからね。

[input.csv](想像)
…,"aaa",…,"1111",…,"kkk",…
…,"bbb",…,"2222",…,"jjj",…


> printf(”%s %s %s\n"、 adata、 bdata、 cdata)
この adata, bdata, cdata は、処理したい内容をわかりやすくするために

| {
| adata=$フィールド番号A
| bdata=$フィールド番号B
| cdata=$フィールド番号C

としたのかな?


あっ、

> adataprint =gsub(”¥””、” ”、adata)
> bdataprint =gsub(”¥””、” ”、bdata)
> cdataprint =gsub(”¥””、” ”、cdata)

これだ!

http://linuxjm.sourceforge.jp/html/GNU_gawk/man1 …
| gsub(r, s [, t])
| …… 置換の個数を返します。……

個数保存しちゃってる。。。

さっきの部分をしたのように換えればできるとおもうよ!
| gsub("\"", " ", adata)
| gsub("\"", " ", bdata)
| gsub("\"", " ", cdata)
| print adata" "bdata" "cdata
    • good
    • 2
この回答へのお礼

ご指摘の通りに変更することでうまくいきました!
”…… 置換の個数を返します。……”はまさかでした。
適切なアドバイスありがとうございました。

お礼日時:2011/06/24 16:46

私も、printfで""が勝手に付くawkなど聞いたことがありません。


そんなawkがあったら、参考のために教えていただきたいです。

普通に考えて、まず間違いなく、その前の段階でadata,bdata,cdataに""が含まれています。

""でくくってあるCSVファイルをFS=,で取り込もうとした、とかではないか、と予想されます

> としてみたのですが思ったような出力
> にはなってくれません

質問するなら、「思ったような出力」にならなかったのなら「どんな出力になったか」を書くようにしましょう。

awkのマニュアルでgsub関数の説明は読んだのですか?
gsubは指定した変数の中身を書き換えて、その書き換え回数を返します

> printf(”%s %s %s\n"、 adataprint、 bdataprint、 cdataprint)
としたら
2 2 2
と表示されたのでは?
    • good
    • 1

これもNo1=質問者



のパターンでしょうか? 質問者がちゃんと情報を記載しないため、何か変ですよね?

普通最初の疑問は

adataなどの変数とはなんぞや、最初からその変数に””が設定されているでしょう。

と考えるはずなんですが・・・・

だとしたら、ちゃんと変数にデーターが格納されるところを記載するでしょう普通。そこがこの質問の変な所ですよね???

http://homepage2.nifty.com/mozu/koza/awk_koza/aw …

にもありますが、printf に””が付加されることはありません、昔からあるawkなら。

そもそもプラットフォームも記載されていない、バージョンも記載されていない。それでやり方を提示しろ?

変な質問。

ちゃんと回答がほしいなら、プラットフォーム、バージョン等を記載すべき。

普通の解決手順は、まず変数に格納されている値になぜ””が付加されるのか、格納前、格納後を、処理のステップごとに確認し、その箇所をただすべき。

つまり、変数に格納したら

print adata;

でもいいし、

printf("%s\n",adata);

でもいい。

どこで””が紛れ込んだか調べるのが最初。自分ですでにわかっているなら、最初から、

””を外すには?

と言うテーマで書くべき。

記載内容だとprintfの操作で設定されてしまったような記載だ。

記載内容は全角文字と半角文字がごちゃまぜだが、実際のスクリプトもそうなんでしょうか?

スクリプトの全文を記載すべきなんじゃないんですか?

もしAWKに渡す前にすでについているならSEDを使って置き換えた後 | で渡せばいいだけの話。
    • good
    • 0

それって、printfのフォーマット指定子%sがダブルクォートを付けている犯人じゃないですか?だとしたら、単純にprintで表示させれば済みそうな気はします。

これでいけたら超簡単!(ただし処理系依存でうまくいかない可能性あり)

print adata,bdata,cdata

どうしてもprintfによるフォーマット指定が必要なら、sprintfで結果を変数に出しておき、それに対してgsubで置換をかければいけると思います。

pdata=sprintf("%s %s %s",adata,bdata,cdata)
gsub(/"/,"",pdata)
print pdata
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています