• 締切済み

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)で取得した単語を使用して処理部で作成された全単語を取得

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.4

処理部の左辺に表れた単語で右辺に出現していない物のリストが欲しいということだと思いますが。 だとすれば、基本的には既に書いたスクリプトの内容を理解できればもう書けるはずです。 また、エラーチェックしないなら、LAYERに出現しているかどうかは結果には関係ないですね。 処理部の左辺に表れたシンボルをテーブルに単語をキーにして値0として入れ、 右辺に出現したらカウント、 最後にテーブルからカウンタが0の物を選んで出力でできます。 ポイントは for( sym in table )とかif( sym in table )でしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

>WORD「0」 =”POL” >WORD[1] = ”GAT” >word_number = 1 >といったものを出力として得たいのです。 やっぱりわかりません。 1) なぜ、POSが選択されないのか 2) なぜ、GATより先にPOLが選択されるのか 3) FLDは未定義だがどう扱うのか、 4) なぜ、POLが選択されるのにAPOLが選択されないのか 5) word_number = 1なのは[1]まで使っているという意味か

Kasaoka-Taroh
質問者

補足

すいません。これは私の単純な記述ミスでした。 このサンプルのケースでは (1) LAYER部でAAPOLが選択される。 (2)処理部で”AAPOL”より論理演算で作成された”APOL”が選択される。 (3)処理部で”AAPOL”より論理演算で作成された”GAT”が選択される。 (4)処理部で”APOL”より論理演算で作成された”POL”が選択される。 (5)処理部で”POL”より論理演算で作成された”POS”が選択される。 よって”AAPOL”より論理演算で作成されたWORDは ”GAT”と”POS”となります。 出力例は WORD[0] = ”POS” WORD[1] = ”GAT” word_number = 1 となります。 ”word_number = 1”の意味は一番最初の”AAPOL”から論理演算で 作成されていったWORDの数が0から1までのつもりで書いています。 WORD配列内の1と2は入れ替わっても問題はないです。 これで理解してもらえればいいのですが.. ”FLD”については サンプルに LAYER AFLD 3 FLD = AFLD NOT WIN の2行を書き忘れていました。

全文を見る
すると、全ての回答が全文表示されます。
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

やはり、何をしたいのかよくわかりませんが、 >(1)”LAYER部”で3単語目が例えば”10”の    場合の2単語目(例では”AAPOL”)を取得 LAYER 単語 数値 のパターンの行があった場合、単語をテーブルに格納という意味でよろしいですか。ならば、 if ( $1 == "LAYER " ) def[$2] = $3; で、def[]に格納できます。 ある単語が登録されているかどうかは、 if ( "ABC" in def ) で判定できます。 >(一旦”APOL”となり更にAPOLを使用して>>POLが作成されているのでPOLとなる。 何をしたいのかわかりません。 単に"APOL"をテーブルに入れたいだけなら、 used[$1]++; のような形で登録できますし、有無は if ( .. in .. )の形で、 内容の一覧は for ( s in used ) で、sに"APOL"... と順番に代入されます。

Kasaoka-Taroh
質問者

補足

処理の概要は サンプルファイル /* LAYER部 */ LAYER AAPOL 10 LAYER ABPOL 11 LAYER ACON  15 LAYER AM1   17 LAYER WIN   177 /* 処理部 */ APOL = AAPOL NOT WIN BPOL = ABPOL NOT WIN M1 = AM1 NOT WIN GAT = AAPOL AND M1 POL = APOL AND FLD POS = POL NOT BPOL  BOOL_END (1) 1単語目が”LAYER” で3単語目が”10”の2単語目を取得   (サンプルでは”AAPOL”) (2)処理部で(1)で取得した単語を使用して論理演算で作成された単語を取得    その際、論理演算で何回か処理されることがあり処理部終端キーワード    まで追いかけて単語を取得したい。(作成される単語数は不定)   サンプルでは   ”APOL = AAPOL NOT WIN”の行でAAPOLからAPOLが作られる 更に”POL = APOL AND M1”の行でAPOLからPOLが作られる。 それと同時に”GAT = AAPOL AND M1”でAAPOLより”GAT”が作られる。 よって出力例としては WORD「0」 =”POL” WORD[1] = ”GAT” word_number = 1 といったものを出力として得たいのです。 実は、この後まだ処理があるのですが、字数の関係でこの部分さえできれば 後は自分でなんとかなりそうなので.. よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

何をしたいかがよくわからないですがこんな感じですか。 連想記憶配列とフィールドセパレータによる単語の分解ができれば、あとはどうにでもなると思います。 よく判らないので、質問が2バイト文字の場合はそのままにしてあります。 def[] ; LAYER部で定義した単語とその値 used[] ; 処理部で出現した単語のその回数 ----------------------------------------- BEGIN { block = 0; FS = "[  \t]" } $1=="LAYER部" { block = 1; } $1=="処理部" { block = 2; $1 = ""; } NF > 2 { if (block==1) layer(); else if (block==2) proc(); } function layer() { for ( i=1 ; i<=NF-2 ; i++ ) { if ( $i == "LAYER" ) { def[$(i+1)] = $(i+2); used[$(i+1)] = 0; } } } function proc() { for ( i=1 ; i<=NF ; i++ ) { if ( $i == "" ) return; if ( $i !~ /(=)|(=)|(NOT)|(AND)/ ) { used[$i]++; } } } END { for( sym in used ) printf("%s(=%s) used %d times\n",sym,def[sym], used[sym]); }

Kasaoka-Taroh
質問者

補足

すいません。質問の仕方がよくなかったようです。 まず、最初の質問の”LAYER部”、”処理部”と書いているのは私が後から追加したただのコメントのつもりで書きました。やりたいことは (1)”LAYER部”で3単語目が例えば”10”の    場合の2単語目(例では”AAPOL”)を取得 (2)(1)で取得した単語を利用して処理部で作成されている単語を取得。(例では”APOL = AAPOL NOT WIN”となりAAPOLからAPOLが作成されているので一旦”APOL”となり更にAPOLを使用してPOLが作成されているのでPOLとなる。 (3)(2)のような処理があるキーワードまで続くので    それを追いかけていく。 そして、(2)の処理はキーワードまで何回処理されているかはわからないのと、何種類の単語が処理によって作成されているかは判らないので、キーワードまでに作成された単語を何かの配列に格納できればと思うのですが、私がよくわからないのは、ある単語が処理をされて名前がどんどん変わっていくものを追いかけていくある種再起的な処理法がよくわからないのです。(これを再起的とは言わないのかも知れませんが...)

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

関連するQ&A

  • AWKスクリプト作成法

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

    • ベストアンサー
    • Perl
  • AWKスクリプト作成法

    以下のような変換をするAWKスクリプトを教えて下さい。 r1 f23 f24 1.6 $.model=RR   ↓ r1 f23 f24 RR 1.6 ”$.model=”の後の文字列を取り出す方法がよく わかりません。    よろしくお願いします。

    • ベストアンサー
    • Perl
  • AWKスクリプト作成法200606

    AWKでのアルゴリズムについての質問です。 やりたいことはあるファイルの中にキーワードとなる文字列を含む行から ”END”という文字列の行までをひとかたまりとして,それを指定された順序 に並び替えたい。 例 元ファイル ・・・KEY1・・・ : END ・・・KEY2・・・ : END ・・・KEY3・・・ : END 順序指定ファイル KEY3 KEY1 KEY2 出力ファイル ・・・KEY3・・・ : END ・・・KEY1・・・ : END ・・・KEY2・・・ : あるデータのかたまりを並び替える方法がどうもひらめきません。 いい方法というかアルゴリズムを教えて下さい。

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

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

  • UNIXでのプログラムその2

    UNIXでのシェル/AWK/SEDなどで以下のような 処理をおこないたいのですがいい方法を教えて下さい。 以下のような変換をやりたい。 MED1 = ( AMED1 NOT WIN ) interact (( BME1_1 OR ACON ) OR TH1 )   ↓ MED1_1 = AMED1 NOT WIN MED1_2 = BME1_1 or ACON MED1 = MED1_1 interact MED1_2 OR TH1

  • 初めから、数値として入力したい

    excel2007です。 例 1.表示形式で「標準」に設定しておく 2.A1セルに1/2(分数として入力したい)と入力 3.1月2日と表示されてしまう 4.表示形式を見てみると「ユーザー定義」となっている という現象になります。 演算をするのが目的なので、初めから1/2と入力したなら 分数の1/2として認識させたいのですが、どのように操作すれば よろしいのですか。 よろしくお願いいたします。

  • 論理演算、ビット演算

    C言語仕様上、真/偽は(Not0/0)であることは理解しています。また、処理順序から、論理演算とビット演算では評価対象の範囲が違うことも知っているつもりです。 その上で質問させていただきます。 お手数ですが、お解りになる方は教えていただけると助かります。 例えば、 i=0,j=0である場合 ( (i == 0) && (j == 0) )は真であると思いますが、 ( (i == 0) & (j == 0) )は規定されているでしょうか。 また、( (i == 0) | (j == 0) )は真となることが(理論上)保証されているように思えますが、問題ないでしょうか。 以上、よろしくお願いいたします。

  • 擬似言語の問題の中のnot foundとは

    現在、基本情報技術者資格取得のための勉強中です。 午後対策として擬似言語の問題を解いているのですが、その問題の命令文の中で分からない箇所が出てきたので教えてください。 反復条件式で K ≦ max and not Found というのが出てきたのですが このnot Foundの意味がわかりません。 なお、整数型変数Kと論理型定数Foundは既に定義されています。 not Foundはおそらく論理型定数Foundがfalseをとっていることを示していると思うのですが、いまいち確信がもてないので教えてください。お願いします。

  • AWKスクリプトについて

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

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

このQ&Aのポイント
  • MFC-J805DWの子機対応について知りたいです。
  • お使いのパソコンやスマートフォンのOS、接続方法、関連するソフトやアプリ、電話回線の種類について教えてください。
  • ブラザー製品MFC-J805DWに関する質問です。子機の対応や接続方法についてお答えします。
回答を見る