나는 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
코드/사용법의 오류는 (적어도) 다음과 같습니다.
스크립트 호출: 그래야 하기
./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
숫자로 정렬하고 세 번째 필드(성을 포함하는 열)를 정렬 키로 사용하도록 지시하여 원하는 작업을 수행할 수 있습니다.
sort -n -k 3
man sort
자세한 내용은 참조하십시오 .