특정 패턴 옆의 합계 값

특정 패턴 옆의 합계 값

옆에 숫자가 있는 여러 태그가 포함된 파일이 있습니다.

<Overall>4
other <tags> and data
<Overall>2
other <tags> and data
<Overall>3

파일을 검색하고 전체 태그 옆에 있는 모든 숫자를 어떻게 계산합니까? 그런 다음 이 숫자를 전체 태그 수로 나누어 전체 평균을 얻습니다.

예를 들어 위 코드에서 평균값은 3입니다.

그런 다음 현재 디렉터리의 모든 파일을 반복하고 각 파일의 전체 평균을 나열합니다.

답변1

awk 사용 (및 숫자가 모든 줄에 있다고 가정)

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print "AVG:",y/x}' file

x 는 성공적인 sub 로 증가합니다 <Overall>. 이는 포함된 행에서만 증가한다는 의미입니다 <Overall>.

그런 다음 다음 블록은 행의 나머지 숫자를 합계에 추가합니다.

END프로그램이 끝날 때 실행됩니다.

마지막 블록의 평균을 인쇄합니다.

편집: 많은 파일의 경우

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print FILENAME,"AVG:",y/x}' LISTOFFILES

답변2

그리고 perl:

perl -lne 'for (/<Overall>([\d.eE+-]+)/g) {$n++; $sum += $1}
           END{print $sum/$n if $n}'

<Overall>이것의 장점은 한 줄에 여러 태그를 처리할 수 있다는 것입니다. [\d.eE+-]+부동 소수점 십진수에 대한 대략적인 일치자입니다(12, 1.2, -1E+20(유효한 숫자는 아니지만)과 같은 것을 허용함).

답변3

awk의 대략적인 접근 방식은 다음과 같습니다.

awk '/^<Overall>/ { 
    sub("<Overall>", ""); 
    sum += $1; 
    lines++; 
  } 
  END { print sum / lines}' 
  tags  ### this is your input file

답변4

다음은 멋진 유틸리티를 사용하는 솔루션입니다.

grep "^<Overall>\d\+" file | cut -c 10 | paste -s -d + - | bc
  1. 파일에서 "<Overkill>"로 시작하고 뒤에 숫자 문자열(예: 숫자)이 오는 줄을 검색합니다.
  2. 행의 나머지 부분에서 숫자를 잘라냅니다.
  3. 모든 선을 "+" 기호로 연결하세요
  4. 결과를 전달하면 bc합계가 계산됩니다.

관련 정보