- 締切済み
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,......; ..........................; ..........................; ..........................; となるようにしたいのですが、誰かプログラムを教えて下さい。。。 お願いします!
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- soft2
- ベストアンサー率0% (0/0)
通りすがりですが、面白そうなので挑戦してみました。 環境: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)
面白そうだったんで、ちょっと考えてみました。 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 ""; } } なお、インデントのため全角の空白を使っています。
お礼
大変遅れました。 とても参考になりました! ありがとうございます!!!