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

答え2

コード/使用法のエラーは(少なくとも)次のとおりです。

  1. スクリプト呼び出し:そうする必要がある./Grades.shためFILE=$1./Grades.sh /path/to/file

  2. OUTTOSORT =:両側にスペースを含めることはできません。=

  3. OUTTOSORT = OUTTOSORT +(1):変数はで参照する必要があります$。つまりOUTTOSORT=$OUTTOSORT

  4. OUTTOSORT = OUTTOSORT +(2):にはそのような文字列連結はありませんbash

  5. "...\n"\nは通常の文字列のエスケープシーケンスではありません。たとえば、次のものが必要です。$'line1\n'

  6. sort < $OUTTOSORT$OUTTOSORTファイルでなければなりませんが、文字列が含まれています。これは可能ですが、echo "$OUTTOSORT" | sortSteeldriverが提案したように、ループとパイプを組み合わせる方が簡単です。whilesort

答え3

Hauke Laging列挙でバグを修正したら、数値sortでソートし、3番目のフィールド(姓を含む列)をソートキーとして使用するように指示することで、目的の操作を実行できます。

sort -n -k 3

man sort詳細は参照してください。

関連情報