モード間の合計平均

モード間の合計平均

私は巨大なテキストファイルを持っており、各行に値またはテキストパターンが含まれています。

各パターン間の平均値または少なくとも合計値をどのように見つけることができますか?

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ユーティリティを使用して計算されます。

関連情報