私は初めて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
コード/使用法のエラーは(少なくとも)次のとおりです。
スクリプト呼び出し:そうする必要がある
./Grades.sh
ためFILE=$1
./Grades.sh /path/to/file
OUTTOSORT =
:両側にスペースを含めることはできません。=
OUTTOSORT = OUTTOSORT +
(1):変数はで参照する必要があります$
。つまりOUTTOSORT=$OUTTOSORT
OUTTOSORT = OUTTOSORT +
(2):にはそのような文字列連結はありませんbash
。"...\n"
:\n
は通常の文字列のエスケープシーケンスではありません。たとえば、次のものが必要です。$'line1\n'
sort < $OUTTOSORT
:$OUTTOSORT
ファイルでなければなりませんが、文字列が含まれています。これは可能ですが、echo "$OUTTOSORT" | sort
Steeldriverが提案したように、ループとパイプを組み合わせる方が簡単です。while
sort
答え3
Hauke Laging列挙でバグを修正したら、数値sort
でソートし、3番目のフィールド(姓を含む列)をソートキーとして使用するように指示することで、目的の操作を実行できます。
sort -n -k 3
man sort
詳細は参照してください。