2016-06-29 6 views
0

를 사용하여 배열에 학생들과 함께 파일을 분할하는 방법 : 나는이 작업을 수행 할 수있는 방법을 사용하여내가처럼 보이는 파일이 AWK

student avarage maximum 
student_a 25  EN 30 
student_b -  - 
student_c 20  EN 20 

:

*students.txt* 
student_a OS 20 
student_a EN 30 
student_b OS - 
student_c OS - 
student_c EN 20 

을 그리고 난 배열로 분할 할 AWK 스크립트 만?

는 지금 난 단지가이 후

#!/usr/bin/awk 
BEGIN { 
    while ((getline line < file) > 0) { 
     print line; 
    } 
    close(file) 
} 
END {} 

내가 그것을 분할하는 방법을 모르겠어요.

+0

시작 마지막 인쇄 인자의 변화를 확인하십시오. 문제가 있으면 여기에 스크립트와 결과를 게시하십시오. 구체적인 질문을하면 도움을받을 확률이 높아집니다. – duffymo

+0

내가 가지고있는 코드를 추가했습니다. 고마워요 – codeNinja7

+0

'평균'은 어디에서 왔습니까? 왜'EN' 문자열이 원하는 출력에 나타나고'OS' 문자열이 아닌지? '갈라짐 '이란 무엇을 의미합니까? – Jdamian

답변

3

누락 된 값을 처리하는 방법이 명확하지 않지만 출력과 일치하는 것으로 보입니다.

$ awk -v OFS='\t' 'maxValue[$1]<$3{maxValue[$1]=$3; maxName[$1]=$2} 
         ($3+0==$3){sum[$1]+=$3; count[$1]++} 
           END{print "student","average","maximum"; 
            for(k in maxValue) 
             print k, 
              count[k]?sum[k]/count[k]:"-", 
              maxName[k]" "maxValue[k]}' file | 
    column -t -s$'\t' 

student average maximum 
student_a 25  EN 30 
student_b -  OS - 
student_c 20  EN 20 

설명

연산 최대 값 및 상기 제 필드 (각각 별개의 첫번째 필드 즉 최대 값/이름 쌍)에 의해 키가 세 번째 필드의 이름을 대응하는 할당. 숫자 값 ($3+0==$3은 숫자 값 테스트)을 합계와 합계로 집계합니다. 인쇄 헤더가 끝나고 각 키에 대해 키 평균 (존재하는 경우) 및 최대 이름/값 쌍을 인쇄하십시오.

형식으로 column -t으로 길이가 다른 탭 필드를 정렬합니다.

UPDATE 은 정확한 출력 정합을 내려면 awk 스크립트를 작성하여

.. print ..., count[k]?maxName[k]" "maxValue[k]:"-"}' 

student average maximum 
student_a 25  EN 30 
student_b -  - 
student_c 20  EN 20 
+0

가독성을 높이고 설명을 추가 할 수 있습니까? – hek2mgl

+0

더 낫지 만 그 들여 쓰기는 실제로 의미가 없습니다. – hek2mgl

관련 문제