• 締切済み

バッチファイル、awkスクリプトの作成について

nightowlの回答

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

こんばんは。この間はお返事ありがとうございました。 どのようなテキストからどのような処理結果がほしいのか、 大まかなイメージだけでも示していただきたかったです。 「バッチファイル」とおっしゃるからには Windows 環境でしょうか。 まずは No.2 の方も URL つきで紹介されていますが、奈良先端大で開発されている 形態素解析システム「茶筌」(ChaSen)をインストールしましょう。 Windows 版の「WinCha」もあります。 以下はあなたの質問文を茶筌にかけてみた結果の一部です。 頻度 ヒンド 頻度 名詞-一般 ごと ゴト ごと 名詞-接尾-一般 に ニ に 助詞-格助詞-一般 並び ナラビ 並ぶ 動詞-自立 五段・バ行 連用形 替える カエル 替える 動詞-自立 一段 基本形 という トイウ という 助詞-格助詞-連語 バッチ バッチ バッチ 名詞-一般 ファイル ファイル ファイル 名詞-一般 か カ か 助詞-副助詞/並立助詞/終助詞 awk 未知語 スクリプト スクリプト スクリプト 名詞-一般 を ヲ を 助詞-格助詞-一般 教え オシエ 教える 動詞-自立 一段 連用形 て テ て 助詞-接続助詞 ください クダサイ くださる 動詞-非自立 五段・ラ行特殊 命令i 。 。 。 記号-句点 また No.1 の方の取り上げられたケースですが、 >「にわにはにわにわとりがいます」 →「に/わに(鰐)/はにわ(埴輪)/にわとり/が/い/ます」 確かに茶筌でも解析誤りに陥ってしまいました。 かしこのような一種「病的」なケースは入力を漢字仮名交じり文とすれば 問題なく回避できます。 さて、原文はファイル「source」に入っているものとして 形態素の出現頻度ごとにソートしてみます。 茶筌の出力フォーマットを指定し、見出し語と品詞のみを表示させます。 参考までに、Linux での処理結果は以下のようになりました。 chasen -F "%m\t%U/%H/\n" source | grep -v EOS | sort | uniq -c | sort -nr 5 に 助詞 4 ごと 名詞 3 を 助詞 3 、 記号 2 並び 動詞 2 分け 動詞 2 頻度 名詞 2 品詞 名詞 2 単語 名詞 2 替える 動詞 2 教え 動詞 2 ファイル 名詞 2 バッチ 名詞 2 スクリプト 名詞 2 の 助詞 2 て 助詞 2 か 助詞 2 awk 未知語 2 。 記号 1 文章 名詞 1 表示 名詞 1 日本語 名詞 1 同様 名詞 1 上 名詞 1 幸い 副詞 1 も 助詞 1 という 助詞 1 です 助動詞 1 で 助詞 1 たら 助動詞 1 た 助動詞 1 その 連体詞 1 し 動詞 1 さらに 副詞 1 ください 動詞 1 いただけ 動詞 気がついたら awk をまったく使っていませんでした。 このように、UNIX/Linux なら単機能のテキストツールを援用して コマンドラインから1行でいけます。 Windows で本格的にテキスト処理を続けるおつもりなら、 Windows に UNIX 環境を提供する「Cygwin」などの導入をお勧めします。 (この件についての追加質問はお受けいたしかねます)

参考URL:
http://www.cygwin.com/,http://www.mars.dti.ne.jp/~sohda/cygwin/

関連するQ&A

  • AWKスクリプトについて

    AWKスクリプトで あるファイルの中の3単語目の最大文字数を表示させたくて以下のようなスクリプトを作成しました。 #!/bin/nawk -f BEGIN{ maxword = 0; } { if( length( $3 ) > $maxword ) maxword = length( $3 ); } END{ print $maxword; } 単純なスクリプトなのですが, テストしてみると空白の出力しかされません。 なにか間違っているのでしょうか? どなたかアドバイスをお願いします。

  • AWKスクリプト作成法 その3

    AWKスクリプトで以下のようなことをやりたいのですが どのようなすればできるでしょうか? いい方法を教えてもらえないでしょうか? 入力ファイル例 LAYER部 LAYER AAPOL 10 LAYER ABPOL 11 LAYER ACON  15 LAYER AM1   17 : 処理部 APOL = AAPOL NOT WIN M1 = AM1 NOT WIN CON = ACON NOT WIN : POL = APOL AND FLD : 修理するファイルの形式  [1]  LAYER部 ”LAYER AAPOL 10”といった形式で”AAPOL”が”10”に割り当てられる [2]  処理部   ”APOL = AAPOL NOT WIN”といった形式で各単語が論理演算される。 [2]の処理部では「1]で定義された単語が何度論理演算されているかはわからない。 AWKでおこないたい処理 (1)LAYER部で”10”、”17”で定義された単語(例では”AAPOL”と”AM1”)を取得 (2)処理部で(1)で取得した単語を使用して処理部で作成された全単語を取得

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

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

  • AWKスクリプトの入力ファイルについて

    AWKスクリプトで入力ファイルを複数使用することは 可能でしょうか? 実際にやりたいことは 例えば ファイル1 NQN PQP RPO ファイル2 MN NQN MP PQP R RPO というような2種類のファイルがありファイル1が実際に処理をする入力ファイル でファイル2が対応表に該当するファイルです。 ファイル1とファイル2を読み込んで ファイル1を NQN MN PQP MP RPO R というように加工して出力したいのですが AWKでこういった処理は可能なのでしょうか?

  • バッチかスクリプト

    こんにちは、早速ですがある共有フォルダ内にあるフォルダやファイルを一発で消せるバッチ又はスクリプトの書き方を教えてください(もちろんアクセス権は有効である条件のもとで)。ちなみにOSはNT4.0です。

  • バッチファイルでテキストファイルを分割したい

    テキストファイルを、指定した数値の倍数の行を、指定した個数に分割するバッチファイルを作成しようとしています。 例えば、以下の様な内容の「in.txt」というテキストファイルを3分割したい場合、 ----- in.txtの内容 ----- 1 2 3 4 5 6 7 8 9 10 ------------------------ 以下の様な内容で、 「out1.txt」「out2.txt」「out3.txt」として出力したいのです。 ----- out1.txtの内容 ----- 1 4 7 10 -------------------------- ----- out2.txtの内容 ----- 2 5 8 -------------------------- ----- out3.txtの内容 ----- 3 6 9 -------------------------- 自分はプログラミングの知識がないので、WEBに書かれている構文を少し書き換えたりして試しているのですが、うまく行きません。 AWKを使い、以下のようなバッチファイルを作成して実行してみましたが、「out3.txt」だけがうまく行きませんでした。構文の意味も分からないので修正も出来ません。 awk "NR%%3==1" "in.txt" > "out1.txt" awk "NR%%3==2" "in.txt" > "out2.txt" awk "NR%%3==3" "in.txt" > "out3.txt" AWKの解説ページを読み始めたのですが、時間的な猶予があまり無く、今回質問させて頂いた処理が出来るようになるまでまだ時間が掛かりそうなので、どなたかお分かりの方がおられましたお教え頂けないでしょうか。 AWKでなくとも、sedでもPerlでもその他のコマンドでも構いませんし、スクリプトファイルを読み込めるコマンドでしたらスクリプトでの書き方でも結構ですので、ご存知の方がおられましたらお教え頂けないでしょうか。

  • バッチファイルで、あるスクリプトがエラーになっても、つぎのスクリプトを実行させたい

    バッチファイルで、あるスクリプトがエラーになっても、つぎのスクリプトを実行させたいと考えています。 具体的には、 ■call.bat■ ****************** call 1.bat call 2.bat ****************** ■1.bat■ ****************** mkdir test1 ****************** ■2.bat■ ****************** mkdir test2 ****************** の3つのバッチファイルで、1.batがエラーになっても 2.batを実行させたいと考えています。 どうしたらいいのでしょうか。 よろしくお願いします。

  • バッチファイル作成について

    フォルダにファイルが一つ入っている状態です。このファイル入りのフォルダを連番で1000個までコピーするためのバッチファイルはどのように作成すればよいでしょうか。 できれば参考となる記載をいただけると幸いです。 宜しくお願い致します。

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

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

  • 今、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がシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?