awk学習ノート(12)-条件文


awkの条件文は上級言語と同じですが、実は次の4つです.
  • if
  • else if
  • else
  • ?:

  • まずテストファイルを作成し、student-marks:
    
      
      
      
      
    1. Jones 2143 78 84 77 
    2. Gondrol 2321 56 58 45 
    3. RinRao 2122 38 37 
    4. Edwin 2537 87 97 95 
    5. Dayan 2415 30 47 

    1)現在、ある科またはいくつかの科の成績が不足しているリストを見つけなければならない.
    
      
      
      
      
    1. awk '{if($3==""||$4==""||$5=="") print $1, "score missing"}' student-marks  

    if文の使い方はCやphpと同じであることがわかります.
    出力結果:
    
      
      
      
      
    1. RinRao score missing 
    2. Dayan score missing 

    2)すべての試験に合格した者と不合格した者を表示し、合格した者はその後に「PASS」を追加表示し、1科目または何科かの不合格者はその後に「FAIL」を表示する.
    まずawkスクリプトを作成します.check-marks.awk:
    
      
      
      
      
    1. if ($3 >=60 && $4 >= 60 && $5 >= 60) 
    2.     print $0,"=>","PASS"
    3. else 
    4.     print $0,"=>","FAIL"

    次に、
    
      
      
      
      
    1. awk -f check-marks.awk student-marks 

    出力の結果は次のとおりです.
    
      
      
      
      
    1. Jones 2143 78 84 77 => PASS 
    2. Gondrol 2321 56 58 45 => FAIL 
    3. RinRao 2122 38 37 => FAIL 
    4. Edwin 2537 87 97 95 => PASS 
    5. Dayan 2415 30 47 => FAIL 

    3)各学生の平均成績を計算して評価し、90点以上はA、80-90はB、70-80はC、70以下はDである.
    まずawkスクリプトを作成しますawk:
    
      
      
      
      
    1. total = $3 + $4 + $5; 
    2. avg = total / 3; 
    3. if(avg >= 90) grade="A"
    4. else if(avg >= 80) grade="B"
    5. else if(avg >= 70) grade="C"
    6. else grade="D"
    7.  
    8. print $0, "=>", grade; 

    実行:
    
      
      
      
      
    1. awk -f grade.awk student-marks 

    出力結果:
    
      
      
      
      
    1. Jones 2143 78 84 77 => C 
    2. Gondrol 2321 56 58 45 => D 
    3. RinRao 2122 38 37 => D 
    4. Edwin 2537 87 97 95 => A 
    5. Dayan 2415 30 47 => D 

    4)ファイル形式を変更し,3名の学生のレコードを出力するごとに改行する.
    
      
      
      
      
    1. awk 'ORS=NR%3?",":"
      "'
       student-marks 

    出力結果:
    
      
      
      
      
    1. Jones 2143 78 84 77,Gondrol 2321 56 58 45,RinRao 2122 38 37 
    2. Edwin 2537 87 97 95,Dayan 2415 30 47, 

    解释一下:?は三目演算子で、Cとphpと同じで、ORSはレコードの区切り記号で、デフォルトは改行記号()で、NRは行番号で、%3は型取りです.上のプログラムの意味は、行番号が3で割り切れると改行が出力され、そうでないとカンマが出力されます.actionが指定されていないため、デフォルトはレコード全体を出力します.
    より多くの組み込み変数はawk学習ノート(5)を参照してください.セパレータを変更します.