【发布时间】:2020-05-16 17:44:06
【问题描述】:
我正在使用 Bash 并尝试编写一个 Awk 脚本,该脚本从 CSV 文件中获取数据,按行对数据进行分组,然后获取值的最小值、最大值和平均值。
这是完整的 CSV 文件:
Student,Catehory,Assignment,Score,Possible
Chelsey,Homework,H01,90,100
Chelsey,Homework,H02,89,100
Chelsey,Homework,H03,77,100
Chelsey,Homework,H04,80,100
Chelsey,Homework,H05,82,100
Chelsey,Homework,H06,84,100
Chelsey,Homework,H07,86,100
Chelsey,Lab,L01,91,100
Chelsey,Lab,L02,100,100
Chelsey,Lab,L03,100,100
Chelsey,Lab,L04,100,100
Chelsey,Lab,L05,96,100
Chelsey,Lab,L06,80,100
Chelsey,Lab,L07,81,100
Chelsey,Quiz,Q01,100,100
Chelsey,Quiz,Q02,100,100
Chelsey,Quiz,Q03,98,100
Chelsey,Quiz,Q04,93,100
Chelsey,Quiz,Q05,99,100
Chelsey,Quiz,Q06,88,100
Chelsey,Quiz,Q07,100,100
Chelsey,Final,FINAL,82,100
Chelsey,Survey,WS,5,5
Sam,Homework,H01,19,100
Sam,Homework,H02,82,100
Sam,Homework,H03,95,100
Sam,Homework,H04,46,100
Sam,Homework,H05,82,100
Sam,Homework,H06,97,100
Sam,Homework,H07,52,100
Sam,Lab,L01,41,100
Sam,Lab,L02,85,100
Sam,Lab,L03,99,100
Sam,Lab,L04,99,100
Sam,Lab,L05,0,100
Sam,Lab,L06,0,100
Sam,Lab,L07,0,100
Sam,Quiz,Q01,91,100
Sam,Quiz,Q02,85,100
Sam,Quiz,Q03,33,100
Sam,Quiz,Q04,64,100
Sam,Quiz,Q05,54,100
Sam,Quiz,Q06,95,100
Sam,Quiz,Q07,68,100
Sam,Final,FINAL,58,100
Sam,Survey,WS,5,5
Andrew,Homework,H01,25,100
Andrew,Homework,H02,47,100
Andrew,Homework,H03,85,100
Andrew,Homework,H04,65,100
Andrew,Homework,H05,54,100
Andrew,Homework,H06,58,100
Andrew,Homework,H07,52,100
Andrew,Lab,L01,87,100
Andrew,Lab,L02,45,100
Andrew,Lab,L03,92,100
Andrew,Lab,L04,48,100
Andrew,Lab,L05,42,100
Andrew,Lab,L06,99,100
Andrew,Lab,L07,86,100
Andrew,Quiz,Q01,25,100
Andrew,Quiz,Q02,84,100
Andrew,Quiz,Q03,59,100
Andrew,Quiz,Q04,93,100
Andrew,Quiz,Q05,85,100
Andrew,Quiz,Q06,94,100
Andrew,Quiz,Q07,58,100
Andrew,Final,FINAL,99,100
Andrew,Survey,WS,5,5
Ava,Homework,H01,55,100
Ava,Homework,H02,95,100
Ava,Homework,H03,84,100
Ava,Homework,H04,74,100
Ava,Homework,H05,95,100
Ava,Homework,H06,84,100
Ava,Homework,H07,55,100
Ava,Lab,L01,66,100
Ava,Lab,L02,77,100
Ava,Lab,L03,88,100
Ava,Lab,L04,99,100
Ava,Lab,L05,55,100
Ava,Lab,L06,66,100
Ava,Lab,L07,77,100
Ava,Quiz,Q01,88,100
Ava,Quiz,Q02,99,100
Ava,Quiz,Q03,44,100
Ava,Quiz,Q04,55,100
Ava,Quiz,Q05,66,100
Ava,Quiz,Q06,77,100
Ava,Quiz,Q07,88,100
Ava,Final,FINAL,99,100
Ava,Survey,WS,5,5
Shane,Homework,H01,50,100
Shane,Homework,H02,60,100
Shane,Homework,H03,70,100
Shane,Homework,H04,60,100
Shane,Homework,H05,70,100
Shane,Homework,H06,80,100
Shane,Homework,H07,90,100
Shane,Lab,L01,90,100
Shane,Lab,L02,0,100
Shane,Lab,L03,100,100
Shane,Lab,L04,50,100
Shane,Lab,L05,40,100
Shane,Lab,L06,60,100
Shane,Lab,L07,80,100
Shane,Quiz,Q01,70,100
Shane,Quiz,Q02,90,100
Shane,Quiz,Q03,100,100
Shane,Quiz,Q04,100,100
Shane,Quiz,Q05,80,100
Shane,Quiz,Q06,80,100
Shane,Quiz,Q07,80,100
Shane,Final,FINAL,90,100
Shane,Survey,WS,5,5
基本上,我有 5 个学生姓名,每个学生都完成了每个课程名称的测验、实验室、作业,以及调查和期末考试...
我要做的是按作业名称对其进行分组,并生成一份报告,显示该作业的最低分、最高分和平均分...
输出应该是:
Name Low High Avg
H02 66 99 74.22
L07 47 88 66.30
并包括第 3 列中的每个单独的分配名称 ($3)。使用制表符 (/t) 格式化
我粘贴的代码已经在 avg 列中输出了标题和小数点后 2 位,但实际值不正确。
我真的只有两个问题:
-
我一辈子都无法获得各个分组的最小值或最大值。我知道如何获取最小值/最大值,甚至是它的基本语法,但是如何将它传递给各个组?
-
编写脚本。我在使用 bash 或任何 Linux 方面的经验非常有限,并且不熟悉 awk(尽管我现在正在学习很多)。
所以,为了让自己至少开始,我写了一个衬里来实现我正在寻找的分组和输出格式,但它只是对每个组的分数求和,平均值都搞砸了,因为我还有不知道如何获取分数以用作除数。
无论如何,这就是我所拥有的:
awk -F "," 'BEGIN{printf "Name\tLow\tHigh\tAvg\n"}
NR>=2{a[$3]+=$4; b[$3]+=$4;c[$3]+=$4/FNR }
END {for (i in b) printf "%-7s\t%d\t%d\t%.02f\n", i,a[i],b[i],c[i]}' \
score-data.csv
输出是完美的,因为它按分配名称分组,平均列中的 2 位小数和选项卡....尝试将总和除以 FNR。也尝试过 NF 和 NR... 没有运气。同样,我知道如何计数,但不知道如何在此处输入。
所以,如果有人可以帮助我处理 min/max/avg 以及将其用作脚本的语法,将不胜感激
由于某种原因我无法发表评论,但我已经搜索了谷歌并阅读了 man awk 的内容,并在我的浏览器中打开了两个不同的选项卡来查看关于 awk 的文档。他们都没有针对我的情况解决这个问题。
就数组命名而言,使用的都是同一个数组;使用第 3 列作为索引/键和第 4 列中的值作为键的值的关联数组。所有建议的搜索和链接都涉及列;我需要行。
【问题讨论】:
-
感谢您在问题中展示您的代码工作。您能否在您的问题中简单地添加输入样本和预期输出样本,然后让我们知道。
-
我建议对数组使用更具描述性的名称;不得不从这里来回跳转到另一个网站的电子表格已经够糟糕的了,然后必须弄清楚
a、b和c指的是什么(并预计未来会出现一些混乱。 .. 几周?几个月?...当你回到这段代码并且不记得这些字母代表什么时,嗯) -
看看awk: find min and max 和use awk to find average 的一些想法;在
awk、min、max和avg上进行谷歌搜索会得到很多点击 -
为什么另一个 Gene 帐户试图使用只有原始发布者才能拥有的信息来编辑此内容?
-
你想要的输出是错误的。对于
H02,最低为47(Andrew),最高为95(Ava),平均为74.60。对于L07,最低为0(Sam),最高为86(Andrew),平均为64.80。
标签: arrays bash shell awk scripting