私のファイルは次のとおりです。パーセントが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
数値以外のフィールドに対して算術を試みるとゼロとして扱われるため、「動作します」。ただし、たとえば変更すると、ヘッダー行が印刷されます。 .IMHOのテストより良いアプローチは、ルールの操作を使用してヘッダー行を明示的にスキップする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