• 締切済み

awkやsedを使って、文書ファイルを行列処理へもっていきたいのですが、誰か助けて下さい!!

・文書ファイル(行番 専門用語 | 説明文 となってます。) 1 ADSL | ADSLは、既存の電話回線を利用して、上りよりも下りの速度の方が速い高速データ通信を行うサービスです。ADSLは,アナログ電話回線を利用し 2 ADSLモデム | 電話回線でADSLによるインターネット接続する際に必要となるモデムです。スプリッタによって分けられたインターネット用のディジタル信号を変復調します。ADSLモデムとパソコンは直接LANケーブルで接続します。最近はADSLモデムにルータ機能を備えたものが多く、複数のLAN端子を備えています。 3 ATM | 高速・広帯域ネットワークを支える伝送交換方式です。フレームリレーより高速で音声、画像、ビデオなどのマルチメディアデータを伝送することができます。リアルタイムに情報を送る回線交換サービスと回線の効率化を行うパケット交換サービスの長所を持ち合わせているので、各種のデータ特性に応じて柔軟に対応することができます。あらゆる種類のデータを、セルと呼ばれる固定長のブロックに分割して伝送する方式です。セルリレーとも呼ばれます。ATMは,パケット交換サービスを基礎とした高速通信です。 ・ ・ ・ この文章を使って1と0の行列を作りたいのですが、 例えば、 1のADSLの説明文に、1、4、6の 2のADSLモデムの説明文に、1、2、5、8の 3のATMの説明文に3、9の 専門用語が出てくるとした時、出力されるファイルが 1,0,0,1,0,1,0,0,0,0,......; 1,1,0,0,1,0,0,1,0,0,......; 0,0,1,0,0,0,0,0,1,0,......; ..........................; ..........................; ..........................; となるようにしたいのですが、誰かプログラムを教えて下さい。。。 お願いします!

みんなの回答

  • soft2
  • ベストアンサー率0% (0/0)
回答No.2

通りすがりですが、面白そうなので挑戦してみました。 環境:FreeBSD awk(たぶんGNU) BEGIN{   maxnum=0; } {   keyword[$1]=$2;   explain[$1]=$4;   if(maxnum<$1){     maxnum=$1;   } } END{   #説明文を検索   for(i=1;i<=maxnum;++i){     str="";     #専門用語を検索     for(j=1;j<=maxnum;++j){       if(match(explain[i],keyword[j])){         str=str "1,";       }else{         str=str "0,";       }     }     #最後の「;」の直前の「,」を除去して出力     print substr(str,0,length(str)-1) ";";   } }

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

面白そうだったんで、ちょっと考えてみました。 awkです。 BEGIN {FS = "|";kc = 1} {split($1, key0, " "); keys[kc] = key0[2]; lines[kc] = $2; kc++} END {   for(i in lines) {     for(j in keys) {       r[i,j] = 0;       if(match(lines[i], keys[j]))         r[i,j]++;     }   }   for(i in lines) {     for(j in keys)       if(j + 1 == kc) {         printf("%s;", r[i,j]);       } else {         printf("%s,", r[i,j]);       }     print "";   } } なお、インデントのため全角の空白を使っています。

GodSalad
質問者

お礼

大変遅れました。 とても参考になりました! ありがとうございます!!!

関連するQ&A