점수를 기준으로 학생 정렬

점수를 기준으로 학생 정렬

저는 새로운 Linux 사용자이며 약 2주 동안 사용해 왔습니다. 저는 매우 간단한 프로그램을 만들려고 합니다. 먼저 설명하겠습니다. 저는 교육 기관 사무실의 보조원입니다. 다음학년보다 1점 낮고 60점 이하인 학생을 정기적으로 신고해야 합니다. 예를 들어 내 보고서에는 다음과 같은 유형의 콘텐츠가 포함되어 있습니다.

1. Michael 89
2. John 79
3. Oliver 79
.
.
.
20. Sarah 39
21. Twain 47
.
.

지금까지 나는 거대한 목록을 살펴보고 모든 학생을 하나씩 기록하는 방식으로 이 작업을 수동으로 수행해 왔습니다. 그러나 이제 나는 bash에서 나를 위해 이 작업을 수행하는 간단한 프로그램을 만들 수 있다고 들었습니다. 나는 grep과 같은 일부 도구를 사용하여 다음과 같은 테스트를 필터링할 수 있다는 것을 알고 있습니다.

[workstation24 ~] cat students_marks |grep 79
[workstation24 ~] cat students_marks |grep 89
[workstation24 ~] cat students_marks |grep 47
[workstation24 ~] cat students_marks |grep 39
.
.
.

또한 다음 내용으로 간단한 프로그램을 만들었습니다.

#!/bin/bash
grep '69\|79\|89'

잘 작동하지만 이 프로그램에 60점 미만의 모든 학생을 나열하도록 지시하는 방법을 모르겠습니다. 60(점수) 미만의 학생 목록을 작성하려면 프로그램에 무엇을 포함해야 하는지 도와주세요. 인사

답변1

Piotr에서 빠르게 편집하여 $3를 마지막 필드인 $NF로 바꿨습니다.

awk '{if ($NF + 0 < 60 || $NF == 69 || $NF == 79 || $NF == 89)print $NF,$0}' file.txt | sort -n | cut -f2- -d' '

$NF는 awk의 마지막 필드이며 첫 번째 필드에 인쇄되므로 정렬 유틸리티가 숫자로 정렬할 수 있습니다(정렬은 오름차순임을 기억하세요. 추가 플래그를 추가하여 변경할 수 있습니다. 내림차순으로 변경(정렬은 -r입니다). ) 전체 라인/레코드/라인 또는 무엇이라고 부르든 $0 때문에 인쇄됩니다. 마지막 부분은 cut을 사용하여 공백 구분 기호를 사용하여 첫 번째 필드/열을 잘라내는 것입니다. 절단에 사용되는 마지막 파이프를 삭제하면 출력을 볼 수 있습니다. 이 코드는 기대만큼 강력하지 않을 수 있지만 참조로 사용할 수 있습니다. 나는 그것이 완벽하다고 주장하지 않습니다.

답변2

제목에 정렬이 언급되어 있으니 그 부분부터 시작해 보겠습니다. GNU/Linux에는 많은 수의핵심 유틸리티, 공백으로 구분된 데이터가 있는 파일을 처리할 수 있습니다. 그래서 당신은 할 수 있습니다유형-n세 번째 열( )에 따라 숫자( )로 표현됩니다 -k 3.

sort -n -k 3 students_marks

또 다른 훌륭한 도구는AWK. 파일을 한 줄씩 읽고 일부 명령문을 실행합니다. 상황에 따라 다음을 사용할 수 있습니다.

awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' student_marks

명령줄에서. 결과를 정렬할 수는 없지만(또는 귀찮게) 파이프를 사용하여 명령의 출력을 다른 명령의 입력에 연결할 수 있습니다 |.

#!/bin/bash
awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' $1 |
sort -n -k 3

스크립트를 실행하면 마지막 스크립트가 $1명령줄에 제공한 인수로 대체됩니다.

관련 정보