awk で変数とパターンを使用する方法

awk で変数とパターンを使用する方法

私のファイルは以下のとおりです。パーセンテージが 80 を超える生徒の記録を表示したいと思います。

Studid    StudName     Asp.Net   DBMS     Unix
   1       Ani         75        62       80
   2       George      90        95       82
   3       Jake        45        30       40
   4       Dennie      89        92       90

そこで私は次のコードを使用しました:

awk '(($3+$4+$5)/3)>80 {print}' stud

動作しますが、これらの列を変数に割り当てて出力を表示したいです。そこで以下のコードを試しましたが、動作しませんでした。

awk 'total=$3+$4+$5, per=total/3, per>80 {print}' stud

変数を使った解決策はありますか?

答え1

ロジックをルールセクションにアクション

awk '{total=$3+$4+$5; per=total/3; if (per>80) print}' stud
   2       George      90        95       82
   4       Dennie      89        92       90

これは列ヘッダーを算術的に評価しようとすることに注意してください。これは、 ではawk数値以外のフィールドは算術演算を行うとゼロとして扱われるため「機能」しますが、たとえばテストを に変更するとヘッダー行が印刷されます。私見では、ルールのアクションper<80を使用してヘッダー行を明示的にスキップするか、nextNR==1

awk 'NR==1 {next} {total=$3+$4+$5; per=total/3; if (per>80) print}' stud
   2       George      90        95       82
   4       Dennie      89        92       90

または、ヘッダーが必要な場合は明示的に印刷します

awk 'NR==1 {print; next} {total=$3+$4+$5; per=total/3; if (per>80) print}' stud
Studid    StudName     Asp.Net   DBMS     Unix
   2       George      90        95       82
   4       Dennie      89        92       90

答え2

試す:

awk ' 
# if /^Studid/ is matched move to the next record (row) of the input text
/^Studid/ { next }
{               
    total=$3+$4+$5
    per=total/3
    if (per > 80)  
        print 
}' stud

出力

   2       George      90        95       82
   4       Dennie      89        92       90

関連情報