私のファイルは以下のとおりです。パーセンテージが 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
を使用してヘッダー行を明示的にスキップするか、next
NR==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