• ベストアンサー

AWKスクリプト作成法

AWKで次のようなプログラムを作成したいと考えています。 A = B AND C D = E NOT A といったような簡単な論理演算を記述しているプログラムらしきものがあるが、例えば上記の例で2行目でE,Aを使用しているが、その場合はE,Aを使用してDを作るより以前にE,Aを定義していなければならない。このルールを守っていない個所をチェックするAWKスクリプトの 記述法、アルゴリズムを教えて下さい。できれば、更に 不正な記述を修正して並べ換えてくれればベストですが..

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

1カラム目は必ず変数で、2カラム目は必ず「=」ですか? とりあえず、そう仮定します。 例題の1行目もB,Cが未定義になってしまうので、 B C A = B AND C D = E NOT A という入力ファイルということにします。 --logic.awk--(コードの例) #!/bin/awk -f BEGIN{  op["NOT"]  op["AND"]  op["NAND"]  op["OR"]  op["NOR"] } {  print $0  if(NF>0) defined[$1]  if(NF>=3){   for(i=3;i<=NF;i++){    if( !($i in op) ){     if( !($i in defined) ){      print " "$i" is used but not defined."     }    }   }  } } ---- --logic.dat--(入力ファイル) A B C = A AND B D = C AND F ---- --実行例と結果-- $ awk -f logic.awk logic.dat A B C = A AND B D = C AND F  F is used but not defined. $ ---- アルゴリズムを考えても、実際コーディングしてみないとアルゴリズムにバグがあるかもしれないので、コーディングしちゃいました。

関連するQ&A

  • 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について

    awkで1から10までを足して,答えをa.datに保存するというプログラムはどのように記述すればよいでしょうか?

  • シェルスクリプトでの演算

    シェルスクリプトで、多項式の演算の記述の仕方を教えてください。 (a+2)+(a*3)-4 のような式はどう記述すればいいのでしょうか。 初歩的な事がわかっていなくてすみません。 よろしくお願いします。 ちなみに.shです。

  • Awkで固定行ずつ行列転置

    A B C D E F G H . . . と、1列にデータが並んだテキストファイルの中身を A B C D E F G H ... のように4列ずつに区切って並べ替えるawkスクリプトを 書きたいのですが、どのように書けばいいでしょうか? もとのデータの行数は4の倍数とは限らないので、 並べ替え後の最後の行はフィールドが4つ未満になるかもしれません。

  • awkで項目番号ごとに行を列に並べる

    [入力ファイル] a  10   1 b  10   2 c  10   3 d  10   4 a  20   5 b  20   6 c  20   7 d  20   8 a  30   9 b  30   0 c  30   1 d  30   2 を、2列目の項目番号を行、1列目の記号を列として (エクセルのピボットテーブルのようなイメージです) 以下のように並べ替えたいのです。 [出力ファイル] No.  a  b  c  d 10  1  2  3  4 20  5  6  7  8 30  9  0  1  2 これをawkスクリプトで書きたいのですが、 どのように書けばよいでしょうか? ※下記2点は希望ですが、難しければ非対応でも大丈夫です。  ・入力ファイルの1行目は一応abcdの順番にきれいに並んでいるものですが   順番がabdcなどとずれていても処理できるスクリプトにしたいです。  ・出力後のabcdの列順序は、スクリプトを修正することで   自由に変更できるとさらに助かります。 教えてください。 よろしくお願いいたします。

  • awk内でsystem関数を使用しfunction

    環境:AIX5.2 シェル:ksh を使用してシェルを作成しています。 awk内でsystem関数を使用しfunctionを呼び出す事は可能でしょうか? 実現したい内容は以下です。 ・awk内で同一シェルに記述されたfunctionを呼び出す ・functionを呼び出す際には引数を渡す 記述イメージ的に以下のような感じでスクリプトに記述していますが、 system関数内で呼び出そうとしているfunctionをfunctionとして 認識できないのでは??っという疑問を持ち始めてます。 function hoge{  HOGE=$1 echo ${HOGE} } awk'{ BEGIN{FS=":"} system(hoge AAA) }'

  • プログラムで論理エラーがあったので、そこでスクリプトを止めたいのですが

    プログラムで論理エラーがあったので、そこでスクリプトを止めたいのですが、 Javascriptでは exit;というものが無いため、処理を止めることができません。 スクリプトを止める一番スマートな方法が知りたいです。 if (a == 1) { alert("通過"); // ここでスクリプトを止めたい。 } また、tryを使うと、catchでエラー表示して、そこで止めたい場合もあるのですが こちらもスクリプトを止める良い方法を探しています。 try { ... } catch (e) { alert("エラーです。"); // ここで止めたい。 }

  • JAVAスクリプトで・・・・・・

    Aという画像をクリックすると、下にB,C,Dというようなメニューが出現するようなJAVAスクリプトを使用したいのですが、どう記述すればよいでしょうか?

  • scriptの記述について

    JavaScript経由でActionScriptを勉強しようとしています。 さしあたりサンプルのコードなどを参考に勉強しているのですが、 例えば getElementById('text') などと記述があった場合、 なぜElementのEとByのBとIdのIが大文字になるのか、そのルールがイマイチわかりません。 サイトや本などでも調べたのですが、その辺りについての説明が載っているものが少なく、「そういうもの」という認識しかありません。 自分でオリジナルのScriptを記述する際に判断がつかないので、記述のルールなどございましたらご教示いただけますでしょう。 よろしくお願いします。

  • JavaScriptの論理演算子について

    JavaScriptの論理演算子について質問です。 「alert(e.target||e.srcElement);」の結果がtrue かfalseではなくて「object HTMLHtmlElement」となるのは何故なのでしょうか? JavaScriptでは"||"は論理演算子ではないのでしょうか? ----------------------------------------------------------------------- <body> <a id="id1">Textarea</a> <script> (function () {   var i = document.getElementById ("id1");   document.addEventListener("dblclick", addEL, false);   function addEL (e) { alert(e.target||e.srcElement);   } }) (); </script> </body>

専門家に質問してみよう