모드 간 합계 평균

모드 간 합계 평균

나는 거대한 텍스트 파일을 가지고 있으며 각 줄에는 값이나 텍스트 패턴이 포함되어 있습니다.

각 패턴 사이의 평균 또는 최소한 합계 값을 어떻게 찾을 수 있나요?

awk/sed 또는 perl 솔루션이 있나요?

예:

pattern1
200
300
pattern2
200
100
200
pattern3
pattern4

예상 출력:

pattern1
250
pattern2
166
pattern3
pattern4

답변1

Awk방법:

awk '/pattern/{ if (cnt) { printf "%d\n", sum/cnt; sum=cnt=0 } print }
     /^[0-9]+$/{ sum += $1; cnt++ }' file

산출:

pattern1
250
pattern2
166
pattern3
pattern4

답변2

Gnu 도구 sed n dc를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

$ sed -re '
    /^[0-9]+$/,/pattern/!b
    /^[0-9]+$/{H;d;}
    x;y/\n/ /
    s#.*#dc -e "0dsn&[+ln1+snz1<+]s+l+xln/p"#ep
    z;x
' file

결과:

pattern1
250
pattern2
166
pattern3
pattern4

후행 행은 숫자일 수 없다고 가정합니다. 또한 음수가 없다고 가정하십시오.

패턴화하려는 숫자만 포함된 행을 찾기 위해 sed에 범위를 설정했습니다. 그렇지 않으면 모든 것이 있는 그대로 인쇄됩니다. 숫자는 Hold nd에 추가되고 평균은 gnu sed의 s///e 명령을 사용하여 dc 유틸리티를 사용하여 계산됩니다.

관련 정보