while-do 루프를 처리하고 반복 출력을 정렬하는 방법

while-do 루프를 처리하고 반복 출력을 정렬하는 방법

나는 Bash 스크립팅을 처음 접했기 때문에 나의 무지를 용서해주십시오. 한 줄씩 읽고 세 가지 시험 점수의 평균을 처리하는 성이 포함된 텍스트 파일이 있습니다. 성별로 정렬된 행을 출력해야 합니다. 이것이 내가 출력하기 전에 정렬을 위해 전달하려고 하는 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숫자로 정렬하고 세 번째 필드(성을 포함하는 열)를 정렬 키로 사용하도록 지시하여 원하는 작업을 수행할 수 있습니다.

sort -n -k 3

man sort자세한 내용은 참조하십시오 .

관련 정보