Loops AWK脚本,以了解给定文本文件的考试数量
我必须创建一个标题行来组织一些考试。我不知道有多少次考试。我知道我必须使用NR==1和NF来确定第一行中有多少字段,但我不知道如何将其放入字符串中 文本文件是Loops AWK脚本,以了解给定文本文件的考试数量,loops,awk,Loops,Awk,我必须创建一个标题行来组织一些考试。我不知道有多少次考试。我知道我必须使用NR==1和NF来确定第一行中有多少字段,但我不知道如何将其放入字符串中 文本文件是 Steve Krause 67 96 78 Will Brown 78 62 86 Andrew Phillips 63 88 79 我需要这根绳子看起来像这样 Name Exam 1 Exam 2 Exam 3 Exam 4 Average 我正在努力格式化
Steve Krause 67 96 78
Will Brown 78 62 86
Andrew Phillips 63 88 79
我需要这根绳子看起来像这样
Name Exam 1 Exam 2 Exam 3 Exam 4 Average
我正在努力格式化第一个字符串,但A)不知道有多少个考试(字段)没有循环,B)不知道每个学生的平均值
这就是我所拥有的,因为我知道只有3门考试
#!/usr/bin/awk -f
{
printf("%s \t %28s %7s %7s %7s %7s\n",
"Name", "Exam 1", "exam 2", "Exam 3", "Exam 4", "Average");
examSTUAVG = ($3 + $4 + $5) / 4;
printf("%s \t %28s %7s %7s %7s %7s\n", $1, "0", $3, $4, $5,examSTUAVG);
for(i = 1; i <= NF; i++){
averages[i] += $(i) / (NF -2);
print(averages[i])
}
}
请注意,sprintf
如何舍入取决于平台,但在许多系统中,它使用无偏舍入,因此舍入到偶数(因此60.25变为60.2,而不是上面的60.3)。如果这是不可接受的,则有其他类型的舍入方法(例如,向上或向下),请参见示例
请注意,
sprintf
如何舍入取决于平台,但在许多系统中,它使用无偏舍入,因此舍入到偶数(因此60.25变为60.2,而不是上面的60.3)。如果这是不可接受的,则有其他类型的舍入方法(例如,向上或向下),请参见示例。请将该样本输入的所需输出(无说明)添加到您的问题中(无评论)。您不确定每个学生参加的测试总数吗?对于所有学生来说,这个数字应该是相同的,还是不同的学生可以参加不同数量的考试?或者你不确定参加考试的学生总数吗?如果有3次考试,为什么要列出4次,并将第一次设置为0?这可能会有所帮助:我不确定参加考试的总数。我知道有三个学生参加了考试。第一次考试每个人都得了0分。请将该示例输入的所需输出(无说明)添加到您的问题中(无评论)。您不确定每个学生参加的考试总数吗?对于所有学生来说,这个数字应该是相同的,还是不同的学生可以参加不同数量的考试?或者你不确定参加考试的学生总数吗?如果有3次考试,为什么要列出4次,并将第一次设置为0?这可能会有所帮助:我不确定参加考试的总数。我知道有三个学生参加了考试。第一次考试每个人都得了0分。
Name Exam 1 Exam 2 Exam 3 Exam 4 Average
Steve 0 67 96 78 60.3
Will 0 78 62 86 56.5
Andrew 0 63 88 79 57.5
$ cat tst.sh
#!/usr/bin/env bash
awk '
BEGIN { OFS="\t" }
NR == 1 {
hdr = "Name" OFS "Exam 1"
for (i=3; i<=NF; i++) {
hdr = hdr OFS "Exam " (i-1)
}
print hdr OFS "Average"
}
{
row = $1 " " $2 OFS 0
tot = 0
cnt = 1
for (i=3; i<=NF; i++) {
row = row OFS $i
tot += $i
cnt++
}
printf "%s%s%0.1f\n", row, OFS, tot / cnt
}
' "${@:--}"
$ ./tst.sh file | column -s$'\t' -t
Name Exam 1 Exam 2 Exam 3 Exam 4 Average
Steve Krause 0 67 96 78 60.2
Will Brown 0 78 62 86 56.5
Andrew Phillips 0 63 88 79 57.5