2013-02-26 8 views
2

I 다음과 같습니다 예를 들어 데이터가 있습니다계산 평균

Flats 2b 
01/1991, 3.45 
01/1992, 4.56 
01/1993, 4.21 
01/1994, 5.21 
01/1995, 7.09 
01/2013, 6.80 
Eagle 2 
01/1991, 4.22 
01/1992, 6.32 
01/1993, 5.21 
01/1994, 8.09 
01/1995, 7.92 
01/2013, 6.33 

내가 내 원하는 출력은 바람직하게는 다음과 같습니다 너무 열이 평균을 계산하기 위해 노력하고있어 :

Flats 2b 
Avg = 4.67 
Eagle 2 
Avg = 5.26 

또는 헤더없이 다음과 같다 심지어 간단한 : 평균 = 4.67 평균 = 등등 5.26

및 ...시 입력 파일은 위에 표시된 것과 같은 데이터가있는 많은 헤더로 가득 차 있습니다.

나는 패턴이 옵션을 일치하고, AWK 한 라이너 성공없이이 같은 뭔가 NR을 사용하여이 작업을 수행하는 것을 시도했다 :

awk '/01/1991,/01/1993 {sum+=$2; cnt+=1} {print "Avg =" sum/cnt}' myfile.txt 

나는 평균을 얻을 수 있지만, 단지 년 1992 년 1991 나의 원하는 평균 1993 년 각 회의 타워에 대해 별도로
도움을 많이 받으실 수 있습니다!

답변

1

당신이 존재하는 경우 스크립트는, 헤더를 찾습니다 평균을 인쇄 AWK를 찾습니다 1991-1993

#! /usr/bin/awk -f 

# new header, print average if exists, reset values 
/[a-zA-Z]/ { 
    if (cnt > 0) { 
     print header; 
     printf("Avg = %.2f\n", sum/cnt); 
    } 
    header=$0; sum=0; cnt=0; 
} 

# calculate average 
/^01\/199[123]/ { sum+=$2; cnt++; } 

# print last average 
END { 
    if (cnt > 0) { 
     print header; 
     printf("Avg = %.2f\n", sum/cnt); 
    } 
} 

만 년 고려할 후 다음 평균 계산을위한 모든 변수를 재설정하는 경우 . 데이터 행을 찾으면 나중에 평균에 필요한 합계를 계산합니다. 마지막 행을 읽으면 최종 평균을 인쇄합니다.

스크립트는 1993 년까지의 1991 년만을 고려합니다. 당신이 년 이상을 포함 할 경우, 당신도이 계정에 모두 1990 년대와 2000 년대 걸리는 계산 라인을 복제하거나 또는 운영자 ||

# calculate average 
/^01\/199[0-9]/ || /^01\/200[0-9]/ { sum+=$2; cnt++; } 

여러 년을 추가 할 수 있습니다.

헤더를 인쇄하지 않으려면 해당 줄 print header을 제거하십시오.

당신은

awk -f script.awk myfile.txt 
+0

감사 등이 awk 스크립트를 부르지 만, 나는 해결책을 생각하는 데 도움이되는 몇 가지 수정 사항을 추가했습니다. – user2100039

+0

@ user2100039 스크립트를 업데이트했습니다. 필요한 스크립트가 있는지 확인하십시오. –

+0

안녕하세요. 감사합니다. 어떻게 이것을 실행합니까? ./yourscript myfile ...? 예기치 않은 토큰'{ '과 6 행의 if 6 (cnt> 0) {' – user2100039