gpt4 book ai didi

Bash 脚本 Awk if 语句

转载 作者:行者123 更新时间:2023-12-05 08:58:27 25 4
gpt4 key购买 nike

给定一个记录格式的输入文件...(ID #, First name, Last name, Score1, Score2, Score3, Score(N)..重要说明:文件中会有很多记录(不仅仅是 1 行)。

我希望能够提供输出格式,例如..(ID#,平均分,平均分对应的Grade字母)

输入示例:

900123123 Joe Brown 100 90 80
900900900 Tyler Black 80 95 75
900231231 Stephen Williams 70 75 80
900111111 Andrew Smith 85 75 90

输出示例:

900123123 90 A
900900900 83.3 B
900231231 75 C
900111111 83.3 B

我的问题是 if 语句来确定要分配的等级字母。这是我当前的代码:

#!/bin/bash
awk '
BEGIN {FS=OFS=" "}
{
sum=0; average=0
for(i=3;i<=NF;i++)
{sum+=$i;}
average = (sum/(NF-3))
if (average -ge 90)
print $1, $2, $3, average, " A";
else if(average -ge 80 && -le 90)
print $1, $2, $3, average, " B";
else if(average -ge 70 && -le 80)
print $1, $2, $3, average, " C";
else if(average -ge 60 && -le 70)
print $1, $2, $3, average, " D";
else
print $1, $2, $3, average, "F";
}' grades.txt

这将导致输出:

900123123 Joe Brown 90  A
900323323 Tyler Black 83.3333 A
900231231 Stephen Williams 75 A
900232232 Andrew Smith 83.3333 A
0 A

为什么即使平均值小于 90,每次都会命中第一个 if 语句?我们知道这一点是因为它在 print 语句内部使用并打印出带有任意数字的 A。另外,我不知道为什么输出 0 A 以及这可能是什么原因。

最佳答案

你的第一个条件是:

if (average -ge 90)

正如@thatotherguy 指出的那样,-ge是一个 shell 构造,awk 中的等价物是 >= . awk 你的声明如下:

if ( (average - ge) 90 )

也就是说:减去名为ge的未赋值变量的数值(即零)来自变量 average然后连接字符串 90结果所以如果平均值是70 ,例如,它会读作:

if ( (70 - 0) 90 )

减去之后是:

if ( 70 90 )

连接后是:

if ( 7090 )

这是一个真实的条件,所以你的脚本将始终执行后续代码行,因为无论减法的结果是什么,你总是会用 90 连接它。并以非零和非空结果结束。

0 A在输出的末尾几乎可以肯定是因为输入文件的末尾有一个空行。您可以通过测试 NF 来防止这种情况发生在进入操作 block 之前。

以下是关于如何编写脚本的建议:

awk 'NF {
sum=0
for(i=3;i<=NF;i++)
sum+=$i
average = sum/(NF-3)
if (average >= 90) grade = "A"
else if (average >= 80) grade = "B"
else if (average >= 70) grade = "C"
else if (average >= 60) grade = "D"
else grade = "F"
print $1, $2, $3, average, grade
}' grades.txt

&& average < 90 没有意义的测试当你在 else测试 average >= 90 的条件的一部分.

关于Bash 脚本 Awk if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com