옆에 숫자가 있는 여러 태그가 있는 파일이 있습니다. 예:
<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
<Overall>
x는 아무것도 없는 서브가 성공할 때마다 증가합니다 . 이는 를 포함하는 줄에서만 증가한다는 것을 의미합니다 <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+-]+
부동 소수점 10진수에 대한 대략적인 일치자입니다(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
- 파일에서 "<Overkill>"로 시작하고 그 뒤에 숫자 문자열(예: 숫자)이 오는 줄을 검색하세요.
- 줄의 나머지 부분에서 숫자를 잘라냅니다.
- 사이에 "+" 기호가 있는 모든 줄을 연결합니다.
- 결과를 에 전달하면
bc
합계가 계산됩니다.