• ベストアンサー

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 などとやっているのですが、何も表示されません。 あとなおかつダブルクォーテーションは削除したいのですが、こちらもファイルへの書き出しがうまく行きません。 どなたかさくっとわかられる方がいらっしゃいましたらアドバイス頂ければと思います。 宜しくお願いします。

  • ad333
  • お礼率100% (3/3)

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

  • ベストアンサー
  • 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% (4845/10255)
回答No.2

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

ad333
質問者

お礼

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

関連するQ&A

  • CSVファイルへの文字列データの書き出しについて

    OS:WindowsXP、Excel:2003 です。 Excelマクロ(VBA)で、あるデータをCSVファイルに出力しているのですが、 文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 CSVへ書き出すときは、そういう仕様になっているということは分かったのですが、 処理の都合上、どうしてもダブルクォーテーションで囲まずに書き出ししたいと思っています。 そういう場合にはどのようにすれば良いのか教えて下さい。 ちなみに、書き出しは「Write」を使っています。

  • ダブルクォーテーション置換時の謎について

    ダブルクォーテーションの入った文字列からダブルクォーテーションを削除するため、置換を使ったのですが何かの数字コードに化けてしまいました。 これはどういう理由でこのような現象になったでしょうか。 5という数字のみ出てきて欲しいのですが。 ご回答よろしくお願いいたします。 以下、サンプルプログラムです。 ------------------------------------------------- $aotype= "\"5"; print "$aotype\n"; $aotype= ~s/\"//g; print "$aotype\n";

    • ベストアンサー
    • Perl
  • EXCEL→CSV保存時のダブルクォーテーションについて

    下記のようにEXCELマクロにてEXCELファイルをCSVファイルに保存しようとしています。 NewBook.SaveAs Filename:="test.csv", FileFormat:=xlCSV, CreateBackup:=False このとき、セル値にダブルクォーテーションが含まれていると、出力CSVファイルの値がダブルクォーテーションで囲まれてしまいます。 ●ダブルクォーテーションが含まれていない場合 セル値→A列:ABC     B列:DEF CSVファイル→ABC,DEF ●ダブルクォーテーションが含まれている場合 セル値→A列:A"C     B列:DEF CSVファイル→"A"C",DEF 後者の場合もダブルクォーテーションで囲まれないようにするにはどうすればよいでしょうか。

  • 「""」の中に「""」を入れるには

    ダブルクォーテーションの中にダブルクォーテーションを入れると エラーになってしまうのですが、何か対策はありますか? <例> print "<dd><textarea name="test" id="name" cols="50" rows="10"></textarea></dd>";

    • ベストアンサー
    • PHP
  • CSVもしくはExcelの使い方

    文字列と数字が書いてあるCSVファイルをExcelで開いて、数字の列だけ””(ダブルクォーテーション)で各セルの数字ごとに囲みたいのですが、一つ一つではなく、まとめて出来るようなやり方ってありますか? 最終的には、テキストで開いたときに、例のようになればいいのですが・・・ 例 ”200”,”1000”,ABC株式会社,”983000”, 営業,”351000”,事務,”200”

  • ファイルの取得について

    お世話になっております。 ただ今JSPにてファイルの存在チェックを行うものを作成しております。 localhost上では new File("test.txt").exists(); で”true”なのですが、 warファイルを作成後、SunOneに配備すると”false”になってしまいます。 test.txtは同じフォルダー上にあります。 String file_path = application.getRealPath("test.txt"); File test = new File(file_path); out.print(test.exists()); としても”false”になってしまいます。 どのように記述すれば”true”になるのでしょうか? お手数ですが、ご教授願います。

    • ベストアンサー
    • Java
  • CSVファイルもしくはExcelの使い方

    文字列と数字が書いてあるCSVファイルをExcelで開いて、数字の列だけ””(ダブルクォーテーション)で各セルの数字ごとに囲みたいのですが、一つ一つではなく、まとめて出来るようなやり方ってありますか? 最終的には、テキストで開いたときに、例のようになればいいのですが・・・ 例 ”200”,”1000”,ABC株式会社,”983000”, 営業,”351000”,事務,”200”

  • phpで二重書込みできないプログラムを作りたい

    PHP初心者です。 テキストファイルに、ある文字列を書き込むプログラムを作ろうとしています。 ファイル内容に同じ文字列があれば書き込まず、 同じ文字列が無ければファイルに書き込むという プログラムを作りたいのですが、 うまくいきません。 どなたかアドバイスをお願いします。 <?php $name = "文字列"; $fp = @fopen("file.txt", "r"); $contents = @file_get_contents($fp); if(ereg($name, $contents)) { print "登録済みです。" ; } else { $fpa = @fopen("file.txt", "a"); fputs($fpa, "$name\n"); fclose($fpa); print "登録しました。"; } fclose($fp); ?>

    • 締切済み
    • PHP
  • Excel VBAでのテキスト出力について

    excel vbaでの文字列出力について エクセルからテキスト(メモ帳とか)に出力したいのですが 下記のように出力できなくて困っております。 どなたか教えてほしいです。 ●入力エクセル AAA BBB CCC DDD EEE セル(1,1)~(1,5)にそれぞれ文字列が入っている状況です。 これを下記のように出力したいのです。 ●テキスト出力 "AAA","BBB",CCC,"DDD",EEE CCCとEEEをダブルクォーテーションを付けないで出力したいのです。 出力の方法でwriteとprintがありますが writeで Write #1, Cells(1,1),Cells(1,2),Cells(1,3),Cells(1,4),Cells(1,5) やると、自動で全ての文字がダブルクォーテーションで囲まれて、カンマが自動でつき "AAA","BBB","CCC","DDD","EEE" のようになってしまします。CCCとEEEのダブルクォーテーションが不要です。 printで Print #1, CStr(Cells(1,1)), & "," CStr(Cells(1,2)), & "," Cells(1,3), & "," CStr(Cells(1,4)), & "," Cells(1,5) とすると "AAA", "BBB", CCC, "DDD", EEE となり、カンマの後ろに空白が何個か入った状態になります。 (ブラウザでは空白が分かりづらいですが、テキストですと入っております。) Trim関数でTrim(",")とか色々試しましたが上手くいきません。 どうしたら望み通りの出力ができるでしょうか。 ぜひ教えて頂きたいです。 よろしくお願いします。

  • 連番の数字を含む文字列の作成

    プログラム結果を連番のファイル名がついたファイルに出力したいと考えています。 fopen(file_name,"-") ; でのファイル名file_nameを01.txt, 02.txtという風に変化させるのだと 思うのですが、連番の数字を含む文字列の作成方法がわかりません。 よろしくお願いします。

専門家に質問してみよう