awkスクリプトでダブルクォーテーションの削除

このQ&Aのポイント
  • awkスクリプトを使用してダブルクォーテーションを削除する方法について教えてください。
  • printf関数とgsub関数を使用してダブルクォーテーションを削除する方法を教えてください。
  • ダブルクォーテーションを削除するためにはどのような処理を行えばよいのでしょうか?
回答を見る
  • ベストアンサー

awkスクリプトでダブルクォーテーションの削除

作成している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 にはなってくれません。 こういった処理はどのようにすればいいのか誰か教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.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/gawk.1.html#lbAX | gsub(r, s [, t]) | …… 置換の個数を返します。…… 個数保存しちゃってる。。。 さっきの部分をしたのように換えればできるとおもうよ! | gsub("\"", " ", adata) | gsub("\"", " ", bdata) | gsub("\"", " ", cdata) | print adata" "bdata" "cdata

Kasaoka-Taroh
質問者

お礼

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

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

私も、printfで""が勝手に付くawkなど聞いたことがありません。 そんなawkがあったら、参考のために教えていただきたいです。 普通に考えて、まず間違いなく、その前の段階でadata,bdata,cdataに""が含まれています。 ""でくくってあるCSVファイルをFS=,で取り込もうとした、とかではないか、と予想されます > としてみたのですが思ったような出力 > にはなってくれません 質問するなら、「思ったような出力」にならなかったのなら「どんな出力になったか」を書くようにしましょう。 awkのマニュアルでgsub関数の説明は読んだのですか? gsubは指定した変数の中身を書き換えて、その書き換え回数を返します > printf(”%s %s %s\n"、 adataprint、 bdataprint、 cdataprint) としたら 2 2 2 と表示されたのでは?

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

これもNo1=質問者 のパターンでしょうか? 質問者がちゃんと情報を記載しないため、何か変ですよね? 普通最初の疑問は adataなどの変数とはなんぞや、最初からその変数に””が設定されているでしょう。 と考えるはずなんですが・・・・ だとしたら、ちゃんと変数にデーターが格納されるところを記載するでしょう普通。そこがこの質問の変な所ですよね??? http://homepage2.nifty.com/mozu/koza/awk_koza/awk_koza_05.html にもありますが、printf に””が付加されることはありません、昔からあるawkなら。 そもそもプラットフォームも記載されていない、バージョンも記載されていない。それでやり方を提示しろ? 変な質問。 ちゃんと回答がほしいなら、プラットフォーム、バージョン等を記載すべき。 普通の解決手順は、まず変数に格納されている値になぜ””が付加されるのか、格納前、格納後を、処理のステップごとに確認し、その箇所をただすべき。 つまり、変数に格納したら print adata; でもいいし、 printf("%s\n",adata); でもいい。 どこで””が紛れ込んだか調べるのが最初。自分ですでにわかっているなら、最初から、 ””を外すには? と言うテーマで書くべき。 記載内容だとprintfの操作で設定されてしまったような記載だ。 記載内容は全角文字と半角文字がごちゃまぜだが、実際のスクリプトもそうなんでしょうか? スクリプトの全文を記載すべきなんじゃないんですか? もしAWKに渡す前にすでについているならSEDを使って置き換えた後 | で渡せばいいだけの話。

noname#194317
noname#194317
回答No.1

それって、printfのフォーマット指定子%sがダブルクォートを付けている犯人じゃないですか?だとしたら、単純にprintで表示させれば済みそうな気はします。これでいけたら超簡単!(ただし処理系依存でうまくいかない可能性あり) print adata,bdata,cdata どうしてもprintfによるフォーマット指定が必要なら、sprintfで結果を変数に出しておき、それに対してgsubで置換をかければいけると思います。 pdata=sprintf("%s %s %s",adata,bdata,cdata) gsub(/"/,"",pdata) print pdata

関連するQ&A

  • awkスクリプトの作成について

    文末に"。""!""?"があれば改行し、さらに文の途中で改行されていたら1行に繋げ、"。""!""?"の後に"」"がある場合は、"。」""!」""?」"で改行するスクリプトを教えてください。途中まではできたので、参考に載せておくのでお願いします。 # onereq.awk # 分析対象テキストを、1文1行(レコード)形式に整形する # 日本語用 # 文末記号 。!?があれば改行 # 文中での改行は1行につなげる # 「」をうまく表示させる { gsub( /。/, "。\n", $0) gsub( /?/, "?\n", $0) gsub( /!/, "!\n", $0) print( $0 ) }

  • bshスクリプト で質問です。

    以下の内容のtmp.txtを aaa bbb ccc ddd eee fff 行末がbbbなら結合としたいです。 --希望結果-- aaa bbb ccc ddd eee fff この場合以下のスクリプトでうまくいかないのですが 原因を教えていただけますか? awk '{ gsub("bbb[\n]$","",$0); print }' tmp.txt OS、HP-UX11.0です。

  • awk と gawk の書き方の違い

    PCでAWKコマンドを使いたくてgawkを使ってみたのですが、 やっぱりawkのような書き方では上手く実行できないみたいです。 gawkのバージョンは v3.1.6です。 コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt 単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。 仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

  • awk詳しい方へ

    あるファイルの最終行のみ、他の行と出力形式を変えたいのですが awkとNRを使ってスマートにできないでしょうか? 詳しい方ご教授お願いします。 不細工に作ると(ファイル名xxxのとき) nnn=`wc -l xxx | awk '{print $1}'` awk '{ if (NR != $nnn) printf("%s %s \n",$1,$2) else printf("%s %s \n",$3,$4) }' aaa こんな感じでしょうか。 なんか、一行とかでかけないでしょうか?

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • UNIX awkコマンド

    シェルスクリプトで、awkをつかって計算を行いたいのですが、 例えば、 file1 5040 というものが入っていたとして、 1列目の5と3列目の4を抽出して 5-4をさせて、 新しいファイルに、1という結果を保存したい場合、 どのようにしたらよいのでしょうか?? awk '{printf("%s\n",substr(0,1-3,1))} file1 > newfile でできると思ったのですができませんでした。 わかる方いましたら教えてください。

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • awkで二つのファイルを比較し出力する方法

    UNIXで二つのファイルを使って別ファイルを出力する 処理をしたいのですが、awkで二つのファイルを扱う方法 が分かりませんでした。 やりたい処理は以下のような事です。 ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、 ファイルBの次の行"YYY bbb"を挟み込みます。 もし、ファイルBに同じ行がなかったら、 ファイルAの次の行に"NG"を挟み込みます。 [ファイルA] AAA B ZZZ B AAA C ZZZ C AAA D ZZZ D [ファイルB] AAA B YYY bbb AAA C YYY bbb [出力ファイル] AAA B YYY bbb ZZZ B AAA C YYY ccc ZZZ C AAA D NG どなたか良いスクリプトありましたら 教えていただけないでしょうか。 よろしくお願いします。

  • AWKスクリプトのエラーびついて

    AWKアスクリプトのエラーについて質問があります。 以下のようなAWKスクリプトでエラーがでます。 #!/bin/nawk -f BEGIN{ npl = 30; ppl = 200; pd = 110; nd = 46; m1 =0.074;   } { 処理 } エラーメッセージ /bin/nawk: syntax error 7 行目 コンテキスト m1 >>> =0.074; <<< なんで,こんなところでエラーが出力されるのかよくわかりません。 どなたか教えていただけないでしょうか?

  • シェルスクリプトについて

    シェルスクリプトを勉強しています。 hoge.txt内で"AAA"という文字列を"BBB"という文字列を検索し下記のような処理を行いたいです。  (1)AAA・BBBともにある場合  →スクリプトを続行  (2)AAA・BBBともにない場合  →スクリプトを停止  (3)AAAしかない場合  →BBBがありませんというメッセージを流す    (4)BBBしかない場合  →AAAなしでスクリプトを続行しますというメッセージを流す   シンプルなやり方でいいので上記のようなことを行いたい場合、どのようにスクリプトを書けばいいのか教えてください。 よろしくお願いします。

専門家に質問してみよう