while-doループを処理し、反復出力をソートする方法

while-doループを処理し、反復出力をソートする方法

私は初めてBashスクリプトに触れたので、私の無知を許してください。 1行ずつ読み、3つのテストスコアの平均を処理する姓を含むテキストファイルがあります。性別にソートされた行を出力する必要があります。これは、私が出力する前にソートのために渡したい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

実行時間:

engr2-6-52-dhcp:homework6 Matt$ ./Grades.sh 
./Grades.sh: line 10: : No such file or directory
./Grades.sh: line 12: $OUTTOSORT: ambiguous redirect

平均を計算した後、これらの行をソートする方法の提案は非常に役立ちます。ありがとうございます!

編集する:

答えてくれてありがとう!今、私が指定したフィールドに基づいてソートされない問題が発生しました。

#!/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

出力:

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)

ご覧のとおり、姓、名前、SIDではなく平均スコアでソートされています。出力の個々の行を整列していることを確認するためにカウンタを追加しました。ソートで正しいキーを無効にするエラーは何ですか?ありがとうございます!

編集する:

ソートの問題に対する解決策が見つかりました。姓と名前の型フラグはnではなくdでなければならないため、whileループコマンドのソートコマンドはにパイプされますsort -k 3,3d -k 4,4d -k 2,2g

ベストアンサー1

結果を標準出力として印刷し、管路これを 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

おすすめ記事