Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops AWK脚本,以了解给定文本文件的考试数量_Loops_Awk - Fatal编程技术网

Loops AWK脚本,以了解给定文本文件的考试数量

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 我正在努力格式化

我必须创建一个标题行来组织一些考试。我不知道有多少次考试。我知道我必须使用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
我正在努力格式化第一个字符串,但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