E-MAIL 野浪研究室 情報機器の操作テキスト ←戻る counter

情報機器の操作テキスト 6b
スクリプト言語「AWK」を活用する

デジタルマグルから
デジタルウィザードへの
第二歩目
「おはようフェルプス君。今回の任務はスクリプト言語「AWK」を活用することにある。 例によって、君もしくはメンバーが捕らえられ、あるいは殺されても 当局はいっさい関知しないからそのつもりで。 尚、このテープは自動的に消滅しない。クルクル回り続ける。 成功を祈る」

いろいろな AWK Script を活用する

1 サイコロシミュレート

BEGIN{
  for(i=1;i<=30000;i++){ # 後の{}内を30000回繰り返す

    r=int(rand()*6+1);   # 0<= x <1 の乱数を作り、6倍し、
                         # 1を加えて、整数化して、1〜6の
                         # 数を作って、変数rに代入する。
    d[r]++;              # rの値の配列の値を1増やす
                         # (ここでは、1〜6の名前が付いた箱に、
                         #  数のカードを1枚入れるというイメージ)
  }
  for(i=1;i<=6;i++){     # 後の{}内を6回繰り返す
    print i "=" d[i];    #1〜6の出目を印刷
  }
}
をコピーしてのScript windowsにctrl+a ctrl+vで張り付けて、ボタンを押す。

2 1〜1000の奇数の合計は

BEGIN{ 
  s=0;t=0;                 # 御破算で願いましては
  n=1000;                  # 1000までの 
  for(i=1;i<=n;i=i+2){  # 1 3 5 7 …… 1000以下まで
    s=s+i;                 # sに奇数を足し込む
    t=t+i+(i+1)            # tに奇数と次の偶数を足し込む
  }
  printf"1〜%d の      合計は %d\n",n,t;
  printf"1〜%d の奇数の合計は %d\n",n,s;
  printf"1〜%d の偶数の合計は %d\n",n,t-s;
}
コピーしてのScript windowsにctrl+a ctrl+vで張り付けて、ボタンを押す。

3 繰り下がりの練習問題作成

BEGIN{
  k=0;
  for(i=18;i>=11;i--){  #引かれる数を18〜11まで順に
    for(j=2;j<=9;j++){  #引く数は2〜9まで順に
      s=i-j;            #答えをsに入れて
      if(s<10){         #繰り下がりの答えになるなら
                        #配列pに問題文字列をセットする
                        #同じ問題を3つ作っておく
        p[k]=sprintf("%2d-%d=   ",i,j);
        p[k+35]=sprintf("%2d-%d=   ",i,j);  
        p[k+70]=sprintf("%2d-%d=   ",i,j);
        k++;
      }
    }
  }
  srand();                #決まった乱数にならないためのおまじない
  for(i=1;i<=1000;i++){   #1000回シャッフルします
    r1=int(rand()*100);   #100個の問題から1つ乱数で選んで
    r2=int(rand()*100);   #100個の問題から1つ乱数で選んで
     temp=p[r1];          #最初の問題は、tempに待避
    p[r1]=p[r2];          #最初の問題の場所に二つめの問題をセット
    p[r2]=temp;           #二つめの問題の場所に、
                          #最初の問題をtempから取り出してセット。
  }
  for(i=1;i<=25;i++){
    printf"%s %s %s %s\n",p[i],p[i+25],p[i+50],p[i+75];
  }
}
コピーしてのScript windowsにctrl+a ctrl+vで張り付けて、ボタンを押す。

4 漢字率を計算する

{
  l=jlength($0);          # 読み込んだ行の全角文字数をlにセット
  for (i=1; i<=l; i++){   # 一文字目から最後の文字まで
    moji=jsubstr($0,i,1)  # moji に 一文字を取り出して
    if(moji~/[亜-龠]/){   # 漢字の範囲に含まれていたら
      kanji++;            # kanji をカウントアップ
    }
    if(moji~/[ーぁ-ヶ]/){ #かな・カナの範囲に含まれていたら
      kana++;             # kana をカウントアップ
    }
  }
}
END{
  printf("総漢字数  %10d\n",kanji);
  printf("総仮名数  %10d\n",kana);
}
をコピーして、のScript windowsにctrl+a ctrl+vで張り付ける。

5 文番号をつける

BEGIN{
  n=split("と は が も を の に から より まで こそ",cont);
  ss="";
}
{
  s=$0;
  gsub("\t","",s);
  gsub("。"    ,"。\f"  ,s);
  gsub("?"    ,"?\f"  ,s);
  gsub("?\f」","?」\f",s);
  gsub("。\f」","。」\f",s);
  gsub("!"    ,"!\f",  s);
  gsub("!\f」","!」\f",s);
  for(i=1;i<=n;i++){
    gsub("。」\f" cont[i],"。」" cont[i],s);
    gsub("?」\f" cont[i],"?」" cont[i],s);
    gsub("!」\f" cont[i],"!」" cont[i],s);
  }
  l=jlength(s);
  flag=0;
  for(i=1;i<=l;i++){
    p=jsubstr(s,i,1);
    if(p~/「/){flag=1};
    if(p~/」/){flag=0};
    if(flag==1 && p~/\f/){
      s=jsubstr(s,1,i-1) jsubstr(s,i+1);
    };
  }
  gsub("\f\n","\n",s);
  ss=ss s;
}
END{
  n=split(ss,aaa,"\f");
  for(i = 1 ; i < n ; i++){
    printf"%3d) %s\n",i,aaa[i];
  }
  print""
}
をコピーして、のScript windowsにctrl+a ctrl+vで張り付ける。

6 集計表をつくる

{
	d1[$1]++;		#縦の項目名を取得する
	d2[$2]++;		#横の項目名を取得する
	d[$1 "\t" $2]++;	#縦横がクロスするセルに出現数を足し込む
}
END{
#実数表作成
	printf"実数表";
	for(i in d2){
		printf"\t%s",i;	#項目行をprintする。
	}
	print"";
	for(i in d1){		#すべての行に対して
		printf"%s",i;	#各行の項目名をprintする 
		for(j in d2){	#すべての列に対して
			printf"\t%d",d[i "\t" j];
				#行のデータをprintする
		}
	print"";
	}
#各列の合計
	for(j in d2){		#すべての列に対して
		tr[j]=0;	#合計を0にして
		for(i in d1){	#すべての行に対して
			tr[j]=tr[j]+d[i "\t" j];#行のデータを足し込む
		}
	}
#各行の合計
	for(i in d1){		#すべての行に対して
		tg[i]=0;	#合計を0にして
		for(j in d2){	#すべての列に対して
			tg[i]=tg[i]+d[i "\t" j];#列のデータを足し込む
		}
	}

#百分率表作成
	printf"\n百分率表[列]";
	for(i in d2){
		printf"\t%s",i;	#項目行をprintする。
	}
	print"";
	for(i in d1){		#すべての行に対して
		printf"%s",i;	#各行の項目名をprintする 
		for(j in d2){	#すべての列に対して
			printf"\t%3.1f",d[i "\t" j]/tr[j]*100;
				#データを列の合計で割って100を掛ける。
		}
	print"";
	}
#百分率表作成
	printf"\n百分率表[行]";
	for(i in d2){
		printf"\t%s",i;	#項目行をprintする。
	}
	print"";
	for(i in d1){		#すべての行に対して
		printf"%s",i;	#各行の項目名をprintする 
		for(j in d2){	#すべての列に対して
			printf"\t%3.1f",d[i "\t" j]/tg[i]*100;
				#データを行の合計で割って100を掛ける。
		}
	print"";
	}
}

をコピーして、のScript windowsにctrl+a ctrl+vで張り付ける。
次の「小学校物語教材で使われている視点」データをコピーして、ボタンを押す。教科書会社がどんな視点で書かれた物語を教科書に選んだかが、分かりやすくなる。(表が見にくい場合は、表をコピーしてエクセルに貼り付けるとよい。
これを手作業で集計するのは、ぞっとしますね。(もし、10000行のデータを手作業で集計すると、何日かかるでしょう)
「小学校物語教材で使われている視点」データ
客観 教出
客観 教出
客観 東書
客観 教出
客観 教出
全知 光村
客観 光村
一人称限定 光村
三人称限定 光村
一人称限定 光村
客観 光村
客観 東書
客観 東書
三人称限定 教出
一人称限定 教出
三人称限定 教出
三人称限定 教出
三人称限定 光村
全知 光村
客観 光村
全知 東書
客観 東書
客観 東書
客観 東書
一人称限定 東書
客観 東書
多視点 教出
多視点 教出
客観 東書
客観 光村
客観 光村
客観 教出
客観 教出
三人称限定 教出
客観 光村
三人称限定 光村
三人称限定 東書
客観 東書
一人称限定 東書
一人称限定 教出
一人称限定 東書
全知 東書
一人称限定 光村
多視点 光村
客観 光村
三人称限定 光村
一人称限定 東書
多視点 光村
三人称限定 光村
三人称限定 教出
一人称限定 教出
一人称限定 光村
客観 東書
三人称限定 東書
一人称限定 東書
一人称限定 東書
三人称限定 東書
一人称限定 光村
客観 光村
一人称限定 教出
三人称限定 教出
三人称限定 教出
三人称限定 光村
三人称限定 光村
三人称限定 東書

7 awk script 空欄補充問題

 時間がまだ余っている人は、awk script 空欄補充問題で、awk script が書けるようになったか、試してみよう。

授業終了五分前

情報機器の操作 受講者 レポート提出用 掲示板 の「題名欄」に「AWKを活用して」、「内容欄」に、「awk」の課題がどこまでできたか、どこが分かりにくかったか、を書く。

次回

webページを作る 1 年賀状ページを作るです。お楽しみに。
E-MAIL 野浪研究室 情報機器の操作テキスト △ ページTop ←戻る