アプリ版:「スタンプのみでお礼する」機能のリリースについて

・文書ファイル(行番 専門用語 | 説明文 となってます。)
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,......;
..........................;
..........................;
..........................;

となるようにしたいのですが、誰かプログラムを教えて下さい。。。
お願いします!

A 回答 (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) ";";
  }
}
    • good
    • 0

面白そうだったんで、ちょっと考えてみました。


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 "";
  }
}

なお、インデントのため全角の空白を使っています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/06 01:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!