• ベストアンサー

awkでのテキスト処理について

WindowsXP + gawk という環境です。 "0000000",16,"False" "0000000",11,"False" "0000000",4,"False" "0000000",9,"False" "0000000",39,"True" "0000000",18,"False" "0000000",39,"True" "0000000",55,"True" というようなファイルがあります。(0000000は任意の数字です) 3列目がTRUEで2列目が30未満のものだけ別ファイルに書き出すという処理をしたいのですが、うまくいきません。 gawk -F, '$3 == "True" {print $2}' file_name などとやっているのですが、何も表示されません。 あとなおかつダブルクォーテーションは削除したいのですが、こちらもファイルへの書き出しがうまく行きません。 どなたかさくっとわかられる方がいらっしゃいましたらアドバイス頂ければと思います。 宜しくお願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

1. スクリプトをファイルに書く。 2. gawk -F, "$3==\"\x22True\x22\"{print $2}" file のようにする。 3. gawk -F, "$3 ~/^\"True\"$/ {print $2}" file のようにする。 cmd.exeでやるのは大変だということで。

ad333
質問者

お礼

ありがとうございました。 インラインで記述する時に、ダブルクォーテーションを「\x22」このように記述されてますが、これは一体どういうことなのでしょうか? インターネットで調べながらコツコツとやってますが、良く分かってません。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

>ダブルクォーテーションを「\x22」このように記述 これは、ダブルクォートが三重に必要だからです。  \"\"True\"\" としてしまうと、\"\" でペアになっているように解釈されて しまうので、それを防ぐためにコードであらわした \x22 を 使っているのです。これはgawkにはダブルクォートでくくられた 文字列の中のエスケープシーケンスと解釈されるので、  "True" という文字列がgawkに渡されるというわけです。 なんにしろ、Unixで使われるシェルに比べるとクォート関連は 貧弱ですので(command.comよりはましですが)、無理せずに ファイルに記述してそれを使うのがよろしいかと思います。 リダイレクト記号 '>', '<' とか、正規表現の文字クラスで '^' が 出てきたときに、cmd.exeの微妙なバグをつついて悲しい思いをすることもあります。

ad333
質問者

お礼

詳しい解説付きでありがとうございます。 後々のことを考えてファイルに書くことにします。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

コマンドプロンプトのコマンドラインで、" を扱うのは素人には無理です。 スクリプトをファイルに書いて、-f オプションで指定して実行します。 ファイル: script.txt {gsub(/"/,"");if($3=="True" && $2<30) print} 実行のコマンドラインは、 gawk -F, -f script.txt INPUT.txt > OUTPUT.txt

ad333
質問者

お礼

>コマンドプロンプトのコマンドラインで、" を扱うのは素人には無理です。 そのようです。素直にファイルに書くことにします。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A