【译】 AWK教程指南 10编写可与用户交互的AWK程序

  执行awk程序时,awk会自动从文件中读取数据来进行处理,直到文件结束。只要将awk读取数据的来源改成键盘输入,便可设计与awk 交互的程序。本节将提供一个该类程序的范例。

范例:本节将编写一个英语生字测验的程序,它将印出中文字意,再由使用者回答其英语生字。

  首先编辑一个数据文件 test.dat (内容不限,格式如下)    

    apple      苹果
    orange     柳橙
    banana     香蕉
    pear      梨子
    starfruit   杨桃
    bellfruit   莲雾
    kiwi       奇异果
    pineapple   菠萝
    watermelon   西瓜

  编辑awk程序"c2e"如下:

    awk '
    BEGIN {
      while( getline < ARGV[1] ){  #由指定的文件中读取测验数据
        English[++n] = $1       #最后, n 将表示题目的题数
        Chinese[n] = $2
      }
      ARGV[1] = "-"   # "-"表示由stdin(键盘输入)
      srand()        # 以系统时间为随机数启始的种子
      question()     #产生考题
    }
    {# awk自动读入由键盘上输入的数据(使用者回答的答案)
      if( $1 != English[ind] )
        print "Try again!"
      else{
        print "\nYou are right !! Press Enter to Continue --- "
        getline
        question()  #产生考题
      }
    }
    function question(){
      ind = int(rand()* n) + 1 #以随机数选取考题
      system("clear")
      print " Press \"ctrl-d\" to exit"
      printf("\n%s ", Chinese[ind] " 的英文生字是: ")
    }
    ' $*

  执行时输入如下指令:    

    $./c2e test.dat

   屏幕将产生如下的画面:

        

  若输入 starfruit

  程序将产生

        

 

说明:

  1. 参数 test.dat (ARGV[1]) 表示储存考题的数据文件文件名。awk 由该文件上取得考题资料后,将 ARGV[1] 改成 "-"。

  "-" 表示由 stdin(键盘输入) 数据。键盘输入数据的结束符号 (End of file)是 ctrl-d。当 awk 读到 ctrl-d 时就停止由 stdin 读取数据。

  2. awk的数学函数中提供两个与随机数有关的函数。

    rand( ): 返回介于 0与1之间的(近似)随机数值。 0 < rand() < 1.

         除非使用者自行制定rand()函数起始的seed,否则每次执行awk程序时,rand()都将以同一个内定的seed为起始。

    srand(x):制定以x作为rand()函数起始的种子。若省略了x,则awk会以执行时的日期与时间为rand()函数起始的seed。(参考附录 C AWK的Built-in Functions)

posted @ 2013-11-21 20:49  阿杰的专栏  阅读(363)  评论(0编辑  收藏  举报