- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个记录格式的输入文件...(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/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!