옆에 숫자가 있는 여러 태그가 포함된 파일이 있습니다.
<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
- 파일에서 "<Overkill>"로 시작하고 뒤에 숫자 문자열(예: 숫자)이 오는 줄을 검색합니다.
- 행의 나머지 부분에서 숫자를 잘라냅니다.
- 모든 선을 "+" 기호로 연결하세요
- 결과를 전달하면
bc
합계가 계산됩니다.