如何处理 while-do 循环并对迭代输出进行排序

Mat*_*son 4 shell-script sort

我是 Bash Scripting 的新手,所以请原谅我的无知。我有一个带有姓氏的文本文件,我正在逐行读取和处理三个测试分数的平均值。我需要输出按姓氏排序的行。这是我必须计算平均值的内容,其中包含一个名为 OUTTOSORT 的变量,我试图在输出之前将其传递给排序。

#!/bin/bash
FILE=$1
OUTTOSORT=""

while read -r SID FIRST LAST S1 S2 S3
do
    SUM=$(expr $S1 + $S2 + $S3)
    AVG=$(expr $SUM / 3)
    OUTTOSORT = OUTTOSORT + "$AVG [$SID] $LAST, $FIRST \n"
done < "$FILE"

sort < $OUTTOSORT
Run Code Online (Sandbox Code Playgroud)

运行时:

engr2-6-52-dhcp:homework6 Matt$ ./Grades.sh 
./Grades.sh: line 10: : No such file or directory
./Grades.sh: line 12: $OUTTOSORT: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)

关于如何在计算平均值后对这些行进行排序的任何建议都会非常有帮助。谢谢!

编辑:

非常感谢您的回答!我现在有一个问题,它没有按我指定的字段排序:

#!/bin/bash
FILE=$1
COUNT=0
while read -r SID FIRST LAST S1 S2 S3 
do
    SUM=$(expr $S1 + $S2 + $S3)
    AVG=$(expr $SUM / 3)
    printf '%d [%d] %s, %s (%d)\n' "$AVG" "$SID" "$LAST" "$FIRST" "$COUNT"
    COUNT=$((COUNT + 1))
done < "$FILE" | sort -k 3,3n -k 4,4n -k 2,2g
Run Code Online (Sandbox Code Playgroud)

输出:

71 [299226663] Camp, Laney (5)
80 [434401929] Camp, Skyler (6)
81 [199144454] Camp, Tracey (4)
82 [123456789] Johnson, Lee (0)
82 [928441032] Forester, Jess (7)
91 [999999999] Smith, Jaime (1)
92 [888111818] Forney, JC (2)
93 [928441032] Forester, Chris (8)
99 [290010111] Lee, Terry (3)
Run Code Online (Sandbox Code Playgroud)

如您所见,它按平均分数排序,而不是按姓氏、名字、SID。我添加了一个计数器来确认它正在对输出的行进行排序。什么错误导致排序不使用正确的键?谢谢!

编辑:

发现排序问题的解决方案:姓氏和名字的类型标志应该是 d 而不是 n,使排序命令成为 while 循环命令管道到sort -k 3,3d -k 4,4d -k 2,2g.

ste*_*ver 7

您可以将结果打印到标准输出,然后将它们通过管道传输到 sort 命令:

while read -r SID FIRST LAST S1 S2 S3
do
     SUM=$(expr $S1 + $S2 + $S3)
     AVG=$(expr $SUM / 3)
     printf '%d [%d] %s, %s\n' "$AVG" "$SID" "$LAST" "$FIRST"
done < "$FILE" | sort
Run Code Online (Sandbox Code Playgroud)